如何在保持DRY的同时测试常见的Rails控制器行为?

时间:2010-08-18 20:33:29

标签: ruby-on-rails rspec authlogic bdd shoulda

我一直在为一些Rails控制器编写RSpec测试,并且我发现了确保Authlogic身份验证正常工作的强烈冲动。我也觉得我应该验证每个操作使用相同的应用程序范围布局。但是,在每个动作中为这种行为编写测试似乎很愚蠢。

我希望看到的是用于过滤器和布局的单行匹配器,类似于Shoulda用于关联和验证的匹配器。不幸的是,似乎没有这样的匹配器可用(除了this blog post中的过滤器的一些Test :: Unit宏)。我很想自己编写它们,但是找不到任何已经完成它的人会让我怀疑是否需要这样的匹配器。

所以我的问题是,你如何测试你的控制器的常见行为(如果你完全测试它),并且单线匹配测试过滤器和布局是否有用?我自己,我试图决定控制器规格中的单行与明确指定过滤器之间的关系,或者只是选择过滤器并忽略控制器中的过滤器和布局(因为它们只是一行代码)。

1 个答案:

答案 0 :(得分:0)

我不喜欢为过滤器编写规范的想法 - 这似乎与实现过于接近。如果您使用TDD / BDD方法从头开始构建控制器,可能您已经先编写了操作,添加了一些逻辑(例如处理身份验证),然后意识到它应该进入过滤器。如果您的规范与“如果当前用户不是帐户用户拒绝索引请求”一致,那么您的规范应该能够执行(aircode)之类的操作:

current_user = Factory.create(:unauthorized)
controller.should_not receive(:index)
get :index
request.should redirect_to(some_safe_path)

操作是否使用过滤器并不重要。

您可以使用Rspec宏来干扰控制器规格。所以(更挥手)

describe MyController do
  should_reject_anonymous(self)
  ...
end

module ControllerMacros
  def should_reject_anonymous(test_controller)
    describe test_controller, "Authentication" do
      it "rejects index" do
        test_controller.should_not_receive(:index)
        get :index
        response.should redirect_to(some_safe_path)
      end
    end
  end
end