【问题标题】:How can I test common Rails controller behavior while staying DRY?如何在保持 DRY 的同时测试常见的 Rails 控制器行为?
【发布时间】:2010-08-18 20:33:28
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我不喜欢为过滤器编写规范的想法——这似乎太接近实现了。如果您使用 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
    

    【讨论】:

    • 好的,所以我们的想法是测试行为,但在宏中进行。好主意。我实际上并没有编写控制器,我只是想正确地指定它们,因为它们已经放在我的腿上:) 一次传递所有动作并执行“it”块是否合理?每个?我可以做类似的事情来验证正确的布局使用。似乎这太小而且特定于项目,也不值得宝石,所以这回答了我的“我应该发布这个”问题:)
    • 天哪!应该有一个“render_with_layout”方法……/我晕倒了
    猜你喜欢
    • 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
    相关资源
    最近更新 更多