Перенаправление Rspec_ для отображения действия

#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]