【问题标题】:Test a base (abstract) controller测试一个基本(抽象)控制器
【发布时间】:2013-03-25 17:06:03
【问题描述】:

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

然后,我使用其他控制器扩展该控制器以添加额外的功能,并且使用路由,我有 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?

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

我尝试过使用“response = controller.index”,但它没有调用之前的过滤器,并且响应不是 http 响应,它只是该命令的输出(我不能像.. .response.should render_template(xxxx) with that)

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

【问题讨论】:

  • the controller is used during a campaign of... 3 weeks and then deleted - 在我看来这应该是数据,而不是代码。
  • 我想知道您是否可以将控制器的功能分解为 PORO 并像 Corey Haines 在他的“快速测试”视频中所做的那样测试该功能:youtube.com/watch?v=bNn6M2vqxHE
  • Jason,假设控制器没有被删除,它们永远存在,我想在没有路由/视图的抽象控制器上测试它们之间的共享代码,我会看到那个视频,希望有帮助

标签: ruby-on-rails rspec controller


【解决方案1】:

您可以使用匿名控制器测试。这里有很好的描述: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

【讨论】:

  • 对于任何想要稍微缩短操作的人,您可以使用head :ok 或使用其他您认为合适的状态码。
【解决方案2】:

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

为了解决没有视图被渲染的问题,我建议你在每个 getpostputdelete 周围加上一个可以从 no-view-found 错误中解救出来的块(I' d 编写一个小辅助函数来执行此操作)。如果您的控制器在最后一步呈现视图,您应该仍然能够检查分配、会话和数据库更改。

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

【讨论】:

  • 是的,我不想测试视图,只想测试作业和那些东西。我真的很喜欢从异常中拯救的想法!我想这是我需要的,我一会儿试试,如果可行,我会接受这个答案
猜你喜欢
  • 2012-04-03
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
相关资源
最近更新 更多