2013-05-22 2 views
0

Я разрабатываю приложение Rails 3.2 с тестовым покрытием, но по какой-то причине некоторые из моих тестов терпят неудачу. Та же спецификация работает для другой модели.Stange Rspec test failing

Спектры работают с Rspec, FactoryGirl, Shoulda-Matchers.

Это недостаток спецификации: http://pastebin.com/8VWCAv79

Ошибки:

Failures: 

    1) PlacesController POST create when user is logged in with valid params redirects to the created place 
    Failure/Error: response.should redirect_to(Place.last) 
     Expected response to be a <:redirect>, but was <200> 
    # ./spec/controllers/places_controller_spec.rb:109:in `block (5 levels) in <top (required)>' 

    2) PlacesController POST create when user is logged in with valid params assigns a newly created place as @place 
    Failure/Error: assigns(:place).should be_persisted 
     expected persisted? to return true, got false 
    # ./spec/controllers/places_controller_spec.rb:104:in `block (5 levels) in <top (required)>' 

    3) PlacesController POST create when user is logged in with valid params creates a new Place 
    Failure/Error: expect { 
     count should have been changed by 1, but was changed by 0 
    # ./spec/controllers/places_controller_spec.rb:96:in `block (5 levels) in <top (required)>' 

Finished in 4.63 seconds 
21 examples, 3 failures 

Failed examples: 

rspec ./spec/controllers/places_controller_spec.rb:107 # PlacesController POST create when user is logged in with valid params redirects to the created place 
rspec ./spec/controllers/places_controller_spec.rb:101 # PlacesController POST create when user is logged in with valid params assigns a newly created place as @place 
rspec ./spec/controllers/places_controller_spec.rb:95 # PlacesController POST create when user is logged in with valid params creates a new Place 

Довольно же спецификации присутствуют в другом файле, http://pastebin.com/r8HtAwSR и правильно мимоходом, без проблем.

Это контроллер файлы:

Может кто-нибудь предложить мне, как решить эту проблему?

ответ

0

Ну, похоже, что по какой-то причине новое место не создано (по моему предположению, оно не проходит проверки).

Попробуйте отладить ваши тесты. Мне нравится использовать pry. Просто добавьте в свой gemfile gem 'pry', запустите пакет, а затем вы можете установить контрольные точки при выполнении.

Например, попробуйте следующее:

it "redirects to the created place" do 
    post :create, {:place => valid_attributes} 
    binding.pry 
    response.should redirect_to(Place.last) 
end 

Выполнение остановится в точке, где вы вставить «binding.pry» и вы можете проверить, что это последнее место в вашем терминале.

+0

К сожалению, это не помогло в решении проблемы ... Странно, что модель проходит все проверки, которые запускаются с использованием той же фабрики, что и в контроллере, поэтому атрибуты равны ... – endorama

+0

@ endorama просто ставит «binding.pry» не решает проблему - конечно. Дело в том, что после того, как у вас есть binding.pry, вы можете затем изучить свою программу, чтобы узнать, что происходит, вы можете «cd» входить и выходить из объектов, показывать источник методов, запускать код и т. Д. У вас есть полный доступ к состоянию всей вашей программы в этот момент, и вы находитесь в гораздо лучшем положении, чтобы найти корень проблемы. – horseyguy

+0

@endorama это не означает, что вы решите свою проблему. Это должно помочь вам узнать, что случилось. Поместите «привязывать pry» в тест, запустите тестовый пакет, выполнение остановится в точке, где вы вставили привязку, измените свой терминал (на один, где работает ваш сервер) и попробуйте «Place.last». Это то, чего вы ожидали? Если не проверить свои действительные_трибуты. Действительно ли они действительны? Что будет возвращено, если вы сделаете что-то вроде «place = Place.new (valid_attributes); place.valid ?;. Если false, проверьте свои ошибки проверки «place.errors», если это правда, проблема находится где-то еще ... –