Ruby on rails 3 如何使用RSpec测试Rails中具有过滤器的搜索控制器操作?

Ruby on rails 3 如何使用RSpec测试Rails中具有过滤器的搜索控制器操作?,ruby-on-rails-3,rspec2,Ruby On Rails 3,Rspec2,在rails应用程序中,几乎所有基于表的视图中都有一个带有过滤器的栏,我们需要测试控制器的操作 代码示例如下: def index @users = User. with_status(params[:status]). with_role(params[:role_id]). search(params[:q]) end 上述方法是ActiveRecord作用域,如果传递的值为空,则设置为绕过这些作用域 我现在需要做的是合理地规范它并测试所有esge案例: 没有

在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
我想写一个矩阵,它将混合和匹配角色、状态和搜索参数,并生成适当的规范示例


<强>是数组排列的解决方案还是有更好的方法?<>强>

< p>我将测试模型中的作用域,确保它们能够正确处理空白值,并正确处理集合值。

然后在控制器内部,我将测试调用链的期望值(使用
stub\u chain
)。链将返回正确的结果这一事实是由以下事实来处理的:每个作用域分别具有正确的行为(您已经测试过了),rails/activerecord确保了组合行为。您应该测试传递的参数是否正确处理

您为测试矩阵而构建的代码令人印象深刻。但对我来说,我试着确保我的测试是可读的,我认为它们是一种文档代码期望被做的文档。对我来说,你的代码一眼就看不懂


希望这能有所帮助。

我会通过排列来完成,但我也有兴趣看看是否有人知道更好的方法。我只是通过排列来完成的,尽管我管理了一个很好的线/规格比率(60+规格大约10线),但我担心它的复杂性。这里是:谢谢分享。如果我找到更好的方法,我会把它寄回这里。