1

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

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

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

4

1 回答 1

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
于 2010-08-19T09:37:05.143 回答