Rails, state_machine, Rspec, capybara, factory_girl, spork и другое. Часть II.
В предыдущей части мы установили и настроили Rspec, guard и т.п.В этой части мы продолжим настраивать наше тестовое окружение.
11. В принципе, мы уже можем переключиться на написание тестов, но мы не ищем лёгких путей! (-: Как бы оно там ни было, но с возрастанием количества тестов растёт время, затраченное на их прохождение. Чтобы хоть как-то сократить его, существует чудесное решение — spork. Spork представляет из себя DRb сервер для различных тестировочных фреймворков. В Gemfole он у нас прописан, приступим. Настроим spork:
$ bundle exec spork —bootstrap
Using RSpec
Bootstrapping /home/none/rails/state_machine31/spec/spec_helper.rb.
Done. Edit /home/none/rails/state_machine31/spec/spec_helper.rb now with your favorite text editor and follow the instructions.
12. Последуем рекомендациям и внесём изменения в spec/spec_helper.rb. Он должен принять примерно следующий вид:
Spork.prefork do
# Loading more in this block will cause your tests to run faster. However,
# if you change any configuration or code from libraries loaded here, you’ll
# need to restart spork for it take effect.
ENV["RAILS_ENV"] ||= ‘test’
require File.expand_path(«../../config/environment», __FILE__)
require ‘rspec/rails’
# Requires supporting files with custom matchers and macros, etc,
# in ./support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
# == Mock Framework
#
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
#
# config.mock_with :mocha
# config.mock_with :flexmock
# config.mock_with :rr
config.mock_with :rspec
config.fixture_path = «#{::Rails.root}/spec/fixtures»
# If you’re not using ActiveRecord, or you’d prefer not to run each of your
# examples within a transaction, comment the following line or assign false
# instead of true.
config.use_transactional_fixtures = true
end
end
Как видите, основные изменения коснулись секции Spork.prefork.
13. Запускаем spork:
Using RSpec
Preloading Rails environment
Loading Spork.prefork block…
Spork is ready and listening on 8989!
14. Тесты будут проходить уже значительно быстрее. Но это ещё тоже не всё. Мы же уже используем утилиту guard. Надо бы их обоих как-то подружить! Для этого в Gemfile добавляем:
gem ‘guard-spork’
И сразу же:
$ bundle install
15. Теперь укажем guard-у, что надо бы работать со spork:
$ guard init spork
spork guard added to Guardfile, feel free to edit it
16. А вот теперь надо немного подшаманить Guardfile. У меня он в итоге получился следующего содержания:
# A sample Guardfile
# More info at https://github.com/guard/guard#readme
guard ‘spork’, :wait => 60, :cucumber => false, :test_unit => false, :rspec_env => { ‘RAILS_ENV’ => ‘test’ } do
watch(‘config/application.rb’)
watch(‘config/environment.rb’)
watch(%r{^config/environments/.+\.rb$})
watch(%r{^config/initializers/.+\.rb$})
watch(‘spec/spec_helper.rb’)
end
guard ‘rspec’, :cli => «—drb», :version => 2 do
watch(%r{^spec/.+_spec\.rb$})
watch(%r{^lib/(.+)\.rb$}) { |m| «spec/lib/#{m[1]}_spec.rb» }
watch(‘spec/spec_helper.rb’) { «spec/» }
# Rails example
watch(%r{^spec/.+_spec\.rb$})
watch(%r{^app/(.+)\.rb$}) { |m| «spec/#{m[1]}_spec.rb» }
watch(%r{^lib/(.+)\.rb$}) { |m| «spec/lib/#{m[1]}_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(‘spec/spec_helper.rb’) { «spec/» }
watch(‘config/routes.rb’) { «spec/routing» }
watch(‘app/controllers/application_controller.rb’) { «spec/controllers» }
# Capybara request specs
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| «spec/requests/#{m[1]}_spec.rb» }
end
Обращаю внимание на то, что секция spork должна быть раньше, чем секция rspec. Иначе всё будет не правильно работать. Как можете заметить, я убрал запуск spork-а для «огурца» и тест_юнита. А вообще, буквально недавно появился отличный скринкаст от Ryan Bates о spork. Ну, естественно, для знающих английский.
17. От теперь можно опять запускать guard:
$ guard start
Лично у меня выдаёт огромное количество ошибок, типа:
1) UsersController GET index assigns all users as @users
Failure/Error: user = User.create! valid_attributes
ActiveRecord::StatementInvalid:
Could not find table ‘users’
# ./spec/controllers/users_controller_spec.rb:32:in `block (3 levels) in <top (required)>’
Ну нет таблицы ‘user’ и хоть ты тресни (-:
18. Придётся уже создать наконец-то эту таблицу:
$ rake db:migrate
19. Однако тесты всё так же не проходят… беда-беда, огорчение! (-: Дело всё в том, что для тестов нужна своя база, свои таблицы. Кто не знает, то разработка осуществляется в среде development, а тестирование — в среде test. Поэтому нам надо сделать среду test идентичной среде development. Для этого выполним:
$ rake db:test:prepare
20. Теперь все тесты, сгенерированные scaffold, должны проходить. У меня пишет следующее:
Finished in 1.93 seconds
30 examples, 0 failures, 2 pending
Done.
21. Теперь можно приступать к написанию свои тестов и дальнейшего развития приложения. Но об этом уже в следующей части.
Недавние записи
- Long time no see
- Ошибка при обновлении Meteor до версии 1.4.2
- Patch falcon для ruby-1.9.3-p327
- Ускоряем ruby и Rails
- Gem ‘seo_params’: определение основных параметров
- Отрицательный margin-top и Opera
- Rspec and Devise reset password
- Backbone.js: Views. Часть первая.
- Backbone.js: Models and Collections
- Backbone.js Routers