【问题标题】:In Rspec, how test a controller action that does not have a route?在 Rspec 中,如何测试没有路由的控制器动作?
【发布时间】:2012-11-28 23:50:05
【问题描述】:

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

例如,我有一个动作

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}"}

【问题讨论】:

  • 测试一个永远不会通过 HTTP 访问的操作的响应代码没有任何意义。同样,get 不相关,因为该操作仅通过(内部)方法调用呈现。
  • 在我的许多控制器方法中,如果某些条件不满足(例如用户权限),我使用“render :action => :no_such_page and return”来呈现错误页面而不是默认页面看法。所以在我看来,在某处测试 no_such_page() 控制器方法是非常有意义的。问题是控制器方法 no_such_page() 没有路由,但确实接受错误消息,然后传递给它的视图。这就是它被实现为控制器方法的原因。
  • 但是你不需要no_such_page 的控制器动作,你只需要一个视图。你没有重定向到它,只是渲染它。

标签: ruby-on-rails rspec controller


【解决方案1】:

更新

回顾您的问题,现在对我来说没有意义,因为您说您只是通过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 输出。如果是这种情况,那么您根本不应该在控制器规范中进行测试,只需使用 view spec 进行测试,这更适合测试响应正文的内容。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 2023-03-10
      • 1970-01-01
      相关资源
      最近更新 更多