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:

$ 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. Теперь можно приступать к написанию свои тестов и дальнейшего развития приложения. Но об этом уже в следующей части.

Недавние записи

Оставить комментарий