4

在我的一些控制器中,我有一个没有相应路由的操作,因为它只能通过render ... and return其他控制器操作中的 a 访问。

例如,我有一个动作

def no_such_page
 # displays a generic error screen
end

在我的 RSpec 控制器测试中,我如何“获取”该方法并查看响应正文?

如果我尝试:

  get :no_such_page
  response.status.should be(200)

它当然给出了错误

No route matches {:controller=>"foo", :action=>"{:action=>:no_such_page}"}
4

2 回答 2

2

更新

回顾您的问题,现在对我来说没有意义,因为您说您只是通过 访问此操作render ... and return,但render呈现的是视图,而不是操作。你确定你甚至需要这个动作吗?我认为视图规范是这个测试的地方。

原始答案

测试永远不会通过 HTTP 请求调用的操作的响应代码是没有意义的。同样get :no_such_page没有意义,因为您无法“获取”该操作(没有通往它的路线),您只能调用该方法。

从这个意义上说,测试它的最好方法是像对待类上的任何其他方法一样对待它,在这种情况下,类是你的控制器,例如PostsController. 所以你可以做这样的事情:

describe PostsController do

  ... other actions ...

  describe "no_such_page" do
    it "displays a generic error screen" do
      p = PostsController.new
      p.should_receive(:some_method).with(...)
      p.no_such_page
    end
  end

end

但实际上,从您写的内容来看,在我看来,您的操作中没有任何内容,您只是在测试相应视图生成的 HTML 输出。如果是这种情况,那么您根本不应该在控制器规范中进行测试,只需使用视图规范进行测试,这更适合测试响应正文的内容。

于 2012-11-29T00:54:38.403 回答
0
before :all do
  Rails.application.routes.draw do
    get '/no_such_page', to: "foo#no_such_page"
  end
end

after :all do
 Rails.application.reload_routes!
end
于 2015-01-09T19:01:27.250 回答