Подтвердить что ты не робот

Как настроить проект Rails Angular для тестирования JS?

Я пытаюсь настроить свой проект Rails Angular для предоставления JS-тестов. Я перепробовал почти все, что нашел в Google:

но я потерпел неудачу со всеми из них. Я ищу способ запуска юнит-тестов и тестов e2e наиболее безболезненным способом (это может быть в Guard или Karma, мне все равно, но он должен запускаться автоматически в фоновом режиме).

У кого-нибудь есть хорошая статья с хорошим примером того, как этого добиться? В моем исследовании я нашел это, но ИМХО это пример того, как НЕ делать этого.

Мой настоящий Gemfile:

source 'https://rubygems.org'

# Use Ruby 1.9.3 instead default Heroku 1.9.2
# for development I suggest https://gist.github.com/1688857
ruby '1.9.3'

gem 'rails', '3.2.12'

# Use PostgreSQL, which is quite awesome, fast and easy
gem 'pg'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails', '~> 3.2.3'
  gem 'bootstrap-sass', '~> 2.3.1'

  # I heard that you like Compass
  gem 'compass'

  # Angular.js
  gem 'angularjs-rails'
  gem 'angularjs-rails-resource'
  gem 'angular-ui-rails'

  # Assets should be minified before production
  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'

# Serve static pages like a boss
gem 'high_voltage'

# Some user management will be nice
gem 'devise' # User management
# gem 'cancan' # And they privileges

# To use Jbuilder templates for JSON
gem 'jbuilder'

# Be fast and deadly as Puma
#gem 'puma'

# We need also some administration panel, don't we?
gem 'rails_admin'

# Some helpers
gem 'andand'

group :development do
  # IRb is ugly. Use Pry for the God sake
  gem 'pry-rails'

  # Deploy with Capistrano
  # gem 'capistrano'
  # or Vlad the Deployer
  # gem 'vlad'

  # Why bother yourself with rerunning tests? Use Guard
  gem 'guard'
  gem 'guard-rspec'
  gem 'guard-spork'
  gem 'guard-livereload'
  gem 'guard-jasmine'
  gem 'rb-fsevent', require: false
  gem 'rb-inotify', require: false

  # Who like ugly error pages? We don't.
  gem 'better_errors'
  gem 'binding_of_caller'

  # Prettier documentation
  gem 'yard'
end

group :development, :test do
  # Use RSpec for testing
  gem 'rspec-rails', '~> 2.12.0'

  # Test JS using Jasmine
  gem 'jasmine'
  gem 'jasmine-headless-webkit'

  # Some DB table generator
  gem 'factory_girl_rails', '~> 4.1.0'

  # And fake data generator
  gem 'ffaker'
end

group :test do
  # Some Gherkins will be also good (to vodka of course)
  gem 'turnip', '~> 1.1.0'

  # Aww, an of course some web browser will be also apprised
  gem 'capybara', '~> 2.0.1'

  # Clean DB after tests
  gem 'database_cleaner'

  # Some nice matchers
  gem 'shoulda-matchers'

  # Extend your mocks
  gem 'bourne', '~> 1.2.1'

  # Coverage reports will be nice
  gem 'simplecov', require: false
end

PS: Было бы неплохо, если бы я мог создавать отчеты о покрытии простым способом.

4b9b3361

Ответ 1

Вы можете использовать teaspoon он запускает ваш любимый набор тестов (по умолчанию это жасмин), и у них есть wiki для интеграции с angular, Teaspoon интегрируется с конвейером активов, поэтому вы можете выбросить все драгоценные камни angular и потребовать их в чайной ложке, сгенерированной spec_helper.js.

Другая интересная вещь: у них есть защитный плагин.

Ответ 2

Я чувствую вашу боль, мне потребовалось немного проб и ошибок, чтобы все тесты выполнялись для моего приложения Rails. Я закончил использование Guard для непрерывного тестирования разработчиков для спецификаций, принятия и javascripts. Вот плоды моего труда.

Это фрагмент Gemfile, который вам нужно включить. Он имеет необходимые драгоценные камни для Guard, Jasmine, Rspec и Turnip. Эта настройка будет работать с MRI и JRuby, мы запускаем наши тесты на обоих.

group :test, :development do
  # Guard
  gem 'guard-jasmine'
  gem "guard-bundler", ">= 1.0.0"
  gem "guard-rails", ">= 0.4.0"
  gem "guard-rspec", ">= 2.5.2"
  gem "rb-inotify", ">= 0.9.0", :require => false
  gem "rb-fsevent", ">= 0.9.3", :require => false
  gem "rb-fchange", ">= 0.0.6", :require => false

  # Rspec
  gem "rspec-rails", '~> 2.12.2'

  # Jasmine
  gem "jasmine", '~> 1.3.1'
  gem "jasminerice"
end

group :test do
  # Turnip
  gem "turnip", '~> 1.1.0'
  gem "capybara", '~> 2.0.3'
end

Это полный файл Guardfile, который следит за Rspec, Turnip и Jasmine для запуска тестов:

guard 'rspec' do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { "spec" }

  # Rails 
  watch(%r{^app/(.+)\.rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
  watch(%r{^app/(.*)(\.erb|\.haml)$})                 { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
  watch(%r{^app/controllers/(.+)_(controller)\.rb$})  { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
  watch(%r{^spec/support/(.+)\.rb$})                  { "spec" }
  watch('config/routes.rb')                           { "spec/routing" }
  watch('app/controllers/application_controller.rb')  { "spec/controllers" }

  # Turnip features and steps
  watch(%r{^spec/acceptance/(.+)\.feature$})
  watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$})   { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
end

guard :jasmine do
  watch(%r{spec/javascripts/spec\.(js\.coffee|js|coffee)$}) { 'spec/javascripts' }
  watch(%r{spec/javascripts/.+_spec\.(js\.coffee|js|coffee)$})
  watch(%r{spec/javascripts/fixtures/.+$})
  watch(%r{app/assets/javascripts/(.+?)\.(js\.coffee|js|coffee)(?:\.\w+)*$}) { |m| "spec/javascripts/#{ m[1] }_spec.#{ m[2] }" }
end

Теперь все становится немного сложнее. Чтобы Jasmine правильно загрузил AngularJS для тестов, я загрузил angular -mocks.js 1.0.7 в каталог spec/javascripts/support/ angular -mocks.js. Это используется специальным помощником и конфигурацией жасмина для запуска спецификаций AnguljarJS.

Для spec/javascripts/spec_helper.js.coffee укажите его в javascript приложения Rails, angular -mocks.js и все спецификации javascript:

#=require ../../app/assets/javascripts/application
#=require ./support/angular-mocks
#=require_tree ./

Для конфигурации Jasmine, spec/javascripts/support/jasmine.yml, config необходимо будет указать на javascript приложения Rails и angular -mocks.js. Вот мы используем, но с комментариями, удаленными для краткости:

src_files:
  - assets/application.js
  - spec/javascripts/support/angular-mocks.js

stylesheets:
  - stylesheets/**/*.css

helpers:
  - helpers/**/*.js

spec_files:
  - '**/*[sS]pec.js'

src_dir:

spec_dir: spec/javascripts

При всех настройках вам просто нужно запустить bundle exec guard, и все тесты будут запущены и будут вызваны изменениями разработки.

Ответ 3

Я написал сообщение в блоге о очень простом способе настройки модульного тестирования AngularJS в приложении Rails, используя драгоценный камень Jasmine по умолчанию. Это потребовало небольшого изменения кода, чтобы заставить работу работать плавно, что было принято командой Jasmine.

http://pivotallabs.com/unit-testing-angularjs-using-jasmine/

В двух словах:

Добавьте жасмин и угловые рельсы к вашему Gemfile

gem "angularjs-rails"
gem "jasmine", github: "pivotal/jasmine-gem"

Установите драгоценные камни и запустите генератор Жасмин

$ bundle install
$ rails g jasmine:install

Добавьте angular к вашему application.js, перед остальной частью вашего кода приложения

//= require angular
//= require_tree .

Создайте файл с именем ./spec/javascripts/helpers/angular_helpers.js и добавьте эту строку

//= require angular-mocks

Теперь вы можете включить файлы реализации AngularJS в каталог app/assets и написать тесты, в которых используются предоставленные макеты. И когда вы обновляете драгоценный камень angularjs-rails, вы будете получать новые версии angular.js и angular-mocks.js одновременно.

Ответ 4

Возможно, вам удастся проверить проект angular, он использует grunt, поскольку система сборки, которая, как я понимаю, не рубится в любом случае, однако я думаю, что, пытаясь проверить вещи с помощью angular, ваша единственная надежда состоит в том, чтобы перейти по пути nodejs/karma.

Эта настройка отслеживает изменения в вашем коде и запускает тесты. Однако в моем ограниченном опыте я не смог заставить его показать результаты тестового прогона. Я не уверен, что я делаю что-то неправильно или если оно не поддерживается.

В любом случае надеюсь, что это поможет