9

我有一个具有某些功能的基本控制器,该基本控制器无法从外部访问,没有路线匹配它。

然后,我使用其他控制器扩展该控制器以添加额外的功能,并使用路由,我有 3 个控制器扩展该基本控制器,只是为了在每个控制器上定义 3 个方法。

我想测试基本控制器,但我做不到

post :index

因为该操作没有路由(没有路由匹配错误)

我不想将这些测试添加到这 3 个控制器之一,因为它们变化很大(控制器在... 3 周的活动中使用,然后被删除)。

一些代码...:

基本控制器,CampaignController

class CampaignController < ApplicationController
  def index
    #some code...
  end

  def campaign_name
    raise('campaign_name missing')
  end

  def campaign_url
    raise('campaign_url missing')
  end

  #more actions....

end

可访问的控制器之一,SchoolCampaignController

class SchoolCampaignController < CampaignController
  def campaign_name
    'school'
  end

  def campaign_url
    school_url
  end
end

这些控制器基本上就是这样,但有时我需要覆盖其中一个基本操作

那么,我做错了什么?如何正确测试 CampaignController?

编辑:我不想测试这两种引发错误的方法,例如我想测试索引或其他一些操作(未显示)

我尝试过使用“response = controller.index”,但它没有调用之前的过滤器,并且响应不是 http 响应,它只是该命令的输出(我不能像...响应那样做期望。应该 render_template(xxxx) 与那个)

编辑 2:为了绕过路由错误,我在 before(:all) 块中创建了测试内部的路由,然后路由不是问题,但是现在,我收到关于不存在视图的错误(每个可访问控制器都实现了所有观点,但抽象的没有)

4

2 回答 2

12

您可以使用匿名控制器测试。这里很好地描述了:https ://relishapp.com/rspec/rspec-rails/v/3-6/docs/controller-specs/anonymous-controller 。

和以前一样,它不需要任何路由猴子补丁Rails.application.routes.draw do

例如:

describe BaseController, type: :controller do
  controller do
    def index
      render text: "Hello World"
    end
  end

  it "returns 200" do
    get :index
    expect(response).to have_http_status 200
  end
end
于 2017-08-15T15:57:23.280 回答
11

我猜你打算测试assigns,session然后db更改,而不是渲染视图。您可以为您的抽象控制器重绘路由,仅用于测试目的(在https://gist.github.com/zilkey/543300上有一个示例)。

为了解决没有视图被渲染的问题,我建议你围绕每个get,或使用一个可以从 no-view-found 错误中解救出来的块(我会编写一个小的帮助函数来做到这一点)。如果您的控制器将视图作为其最后一步呈现,您应该仍然能够检查分配、会话和数据库更改。postputdelete

另一种方法是为抽象控制器的特定实例编写测试,并分解出控制器名称和所需的任何数据。这样您就不会遇到针对不起作用的控制器进行功能测试的问题,并且您可以轻松地每 3 周重写一次测试。

于 2013-04-04T11:12:05.453 回答