【问题标题】:How to test a search controller action which has filters in Rails with RSpec?如何使用 RSpec 测试在 Rails 中具有过滤器的搜索控制器操作?
【发布时间】:2011-09-16 13:50:37
【问题描述】:

我们在 Rails 应用程序中几乎所有基于表格的视图中都有一个带有过滤器的栏,我们需要测试控制器操作。

代码示例:

def index
  @users = User.
    with_status(params[:status]).
    with_role(params[:role_id]).
    search(params[:q])
end

上述方法是 ActiveRecord 范围,如果传递的值为空,则设置为绕过。

我现在需要做的是合理地规范它并测试所有 esge 案例:

  • 没有传递参数
  • 仅角色、仅状态、仅搜索
  • 角色 + 状态、角色 + 搜索、...(2 对)
  • 角色 + 状态 + 搜索

我写的基本规范示例如下:

context "when filtering by status" do
  before do
    1.times { Factory(:user, :status => "one") }
    3.times { Factory(:user, :status => "other") }
  end

  it "returns only users with the provided :status" do
    get :index, :status => "one"

    assigns(:users).size.should == 1
    assigns(:users)[0].status.should == "one"
  end
end

我想编写一个矩阵来混合和匹配角色、状态和搜索参数并生成适当的规范示例。

Array#permutation 是解决方案还是有更好的方法?

【问题讨论】:

  • 我会通过排列来做,但我也有兴趣看看是否有人知道更好的方法。
  • 我只是用排列完成了它,即使我管理了一个很好的行/规格比(对于 60 多个规格大约 10 行),我担心它的复杂性。
  • 感谢分享。如果我找到更好的方法,我会在这里发布。

标签: ruby-on-rails-3 rspec2


【解决方案1】:

我会测试模型中的作用域,所以要确保它们能正确处理空白值,也能正确处理设定值。

然后在控制器内部,我将测试调用链的期望(使用stub_chain)。链将返回正确结果的事实是通过每个范围单独具有正确行为(您测试过)这一事实来处理的,并且组合行为由 rails/activerecord 确保。您应该测试传递的参数是否正确处理。

您为测试矩阵而构建的代码令人印象深刻。但对我来说,我试图确保我的测试是可读的,我认为它们是一种关于一段代码应该做什么的文档。对我来说,您的代码乍一看是无法理解的。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多