#ruby-on-rails #rspec2
#ruby-on-rails #rspec2
Вопрос:
Я изучаю rails и столкнулся с проблемой с Rspec. У меня есть следующий тест для контроллера:
describe PostsController, "creating a new post" do
it "should redirect and show the post" do
Post.stub!(:save).and_return(true)
post "create"
response.should redirect_to :action => "show"
end
end
Когда я запускаю этот тест, я получаю следующий сбой:
PostsController creating a new post should redirect and show the post
Failure/Error: response.should redirect_to :action => "show"
ActionController::RoutingError:
No route matches {:action=>"show", :controller=>"posts"}
# ./spec/controllers/posts_controller_spec.rb:8:in `block (2 levels) in <top (required)>'
Тем не менее, когда я проверяю свои маршруты, я вижу свое действие show для моего контроллера posts:
post GET /posts/:id(.:format) {:action=>"show", :controller=>"posts"}
Вероятно, я упускаю что-то очень простое, но изо всех сил пытаюсь это найти.
Спасибо.
Ответ №1:
Вы забыли id
.
Обычно я пишу
response.should redirect_to(post_path(assigns[:post])
Ответ №2:
Краткое замечание по вышесказанному. В версии 2.13.0 rspec-rails синтаксис, который я использовал для этого, был:
expect(response).to redirect_to(video_path(assigns[:video]))
(Я тестировал метод создания контроллера для моей видеомодели). Вот мой полный блок описания rspec для #create:
describe "POST #create" do
context "with valid attributes" do
it "saves the new video in the database" do
expect{
post :create, video: attributes_for(:video)
}.to change(Video, :count).by(1)
end
it "redirects to the videos page" do
post :create, video: attributes_for(:video)
expect(response).to redirect_to(video_path(assigns[:video]))
end
end
end
Комментарии:
1. На самом деле это хороший тест. Вы можете сократить его до
redirect_to assigns(:video)
. Важно сначалаpost
, а затем ожидать, чтоresponse
что-то сделает. Выполнениеexpect { post ... }
не будет работать правильно, как я только что узнал.
Ответ №3:
Вы также можете проверить перенаправление более коротким способом. Просто:
expect(response).to redirect_to assigns[:video]