ТЛ: др
Добавить хеш ошибки в макет:
Carrier.stub(:new) { mock_carrier(:save => false,
:errors => { :anything => "any value (even nil)" })}
Это вызовет желаемое поведение в respond_with
.
Что здесь происходит
Добавьте это после post :create
response.code.should == "200"
Не удается с expected: "200", got: "302"
. Таким образом, он перенаправляет вместо рендеринга новый шаблон, когда он не должен. Куда это идет? Дайте ему путь, который, как мы знаем, потерпит неудачу:
response.should redirect_to("/")
Теперь это не с Expected response to be a redirect to <http://test.host/> but was a redirect to <http://test.host/carriers/1001>
Спецификация должна пройти путем рендеринга шаблона new
, который является нормальным ходом событий после того, как save
на фиктивном объекте Carrier возвращает false. Вместо этого respond_with
заканчивается перенаправлением на show_carrier_path
. Что просто неправильно. Но почему?
После некоторого копания в исходном коде, похоже, что контроллер пытается отрисовать «carrier / create». Такого шаблона нет, поэтому возникает исключение. Спасательный блок определяет, что запрос является POST, и в хэше ошибки нет ничего, после чего контроллер перенаправляет на ресурс по умолчанию, который является фиктивным Carrier
.
Это озадачивает, поскольку контроллер не должен предполагать, что существует допустимый экземпляр модели. Это create
в конце концов. На данный момент я могу только предположить, что тестовая среда каким-то образом использует ярлыки.
Таким образом, обходной путь должен предоставить хэш ложной ошибки. Обычно что-то будет в хэше после сбоя save
, так что это имеет смысл.