Ruby on rails 如何在保持干燥的情况下测试common Rails控制器的行为?

Ruby on rails 如何在保持干燥的情况下测试common Rails控制器的行为?,ruby-on-rails,rspec,authlogic,bdd,shoulda,Ruby On Rails,Rspec,Authlogic,Bdd,Shoulda,我一直在为一些Rails控制器编写RSpec测试,我发现了一种强烈的冲动,即确保Authlogic身份验证正常工作。我还觉得我应该验证每个操作是否使用相同的应用程序范围布局。然而,在每个动作中为这种行为编写测试似乎都很愚蠢 我想看到的是过滤器和布局的单线匹配器,类似于Shoulda的关联和验证匹配器。不幸的是,似乎没有这样的匹配器可用(中过滤器的一些Test::Unit宏除外)。我很想自己去写,但是找不到已经写过的人,这让我怀疑是否真的需要这样的匹配者 所以我的问题是,如何测试控制器的常见行为(

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

我想看到的是过滤器和布局的单线匹配器,类似于Shoulda的关联和验证匹配器。不幸的是,似乎没有这样的匹配器可用(中过滤器的一些Test::Unit宏除外)。我很想自己去写,但是找不到已经写过的人,这让我怀疑是否真的需要这样的匹配者


所以我的问题是,如何测试控制器的常见行为(如果您测试它的话),以及测试过滤器和布局的一行匹配器是否有用?我自己,我试图在控制器规范中的一行代码与明确指定过滤器相结合,或者只是指定过滤器并忽略控制器中的过滤器和布局(因为它们只是一行代码).

我不喜欢为过滤器编写规范的想法——这似乎离实现太近了。如果您使用TDD/BDD方法从头开始构建控制器,那么您可能会先编写操作,添加一些逻辑(例如,处理身份验证),然后意识到应该将其放入过滤器中。如果您的规范遵循“如果当前用户不是帐户用户,则拒绝索引请求”,那么您的规范应该能够执行以下操作(aircode):

不管动作是否使用过滤器

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


好的,我们的想法是测试行为,但要在宏中进行。好主意我并没有真正编写控制器,我只是尝试正确地规范它们,因为它们已经放在我的膝盖上:)一次传递所有操作并对每个操作执行“it”块合理吗?我可以做类似的事情来验证正确的布局使用。这似乎是太小和项目特定的宝石值得太多,所以回答了我的“我应该发布这个”的问题:)天哪!应该有一个“使用布局渲染”的方法/我晕倒了
current_user = Factory.create(:unauthorized)
controller.should_not receive(:index)
get :index
request.should redirect_to(some_safe_path)
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