【问题标题】:How to access a controller method from a Cucumber test - or alternatives?如何从 Cucumber 测试或替代方法中访问控制器方法?
【发布时间】:2016-02-07 16:22:20
【问题描述】:

我有一个具有用户模型的应用程序,并且用户具有不同的角色。角色在内部表示为整数索引,但作为字符串呈现给用户。我还有一个辅助函数access_level(在application_controller.rb - 这是一个合理的地方吗?)它采用整数索引或字符串表示并返回有关角色的大量信息的散列(包括字符串表示和索引,因此这是在它们之间进行转换的便捷方式)。万一这很重要,access_level 又取决于在config\initializers 的文件中定义的角色定义。

因为呈现给用户的界面取决于角色,所以我的测试有很多诸如Given I have the role of administrator之类的东西。我正在尝试使用 FactoryGirl.create(:user, role: access_level(role).index) 创建用户,但我无法让 Cucumber 看到 access_level

我在谷歌上找到的大多数建议都是“不要那样做”,因为在后台调用函数违反了将 Cucumber 保持在 UI 级别的原则,但我看不到测试这种用户行为的方法Cucumber 不知道如何将角色名称映射到索引。当然,我可以在我的 Cucumber 支持文件之一中复制 access_level,但这违反了 DRY。那么应该我应该如何构造它以便能够在 Cucumber 中干净地测试它?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 cucumber capybara


    【解决方案1】:

    Cucumber 驱动程序模拟浏览器,因此步骤定义没有控制器实例或访问控制器实例方法。

    使该控制器方法可用于 Cucumber 步骤定义的最简单方法是将其设为类方法并使用 ApplicationController.access_level 调用它。然而,这会很糟糕,因为它会使步骤定义依赖于他们不应该知道的类。

    相反,将您要在应用程序和 Cucumber 步骤定义中使用的代码放入一个模块中,并将该模块包含在 ApplicationController 和 Cucumber 世界中。

    在 app/models/access_control.rb 中:

    module AccessControl
      def access_level(role)
        # do whatever is necessary
      end
    end
    

    (我猜它应该在模型目录中,因为我觉得它是模型级别的问题,但这并不重要。)

    在 app/controllers/application_controller.rb 中:

    class ApplicationController < ActionController::Base
      include AccessControl
      # ...
    end
    

    在 features/support/env.rb 中:

    World AccessControl
    

    【讨论】:

      【解决方案2】:

      我被告知 Cucumber 场景应该复制用户行为。但这并不能否定您需要创建具有特定角色的特定用户来进行测试的事实。将我们的自动化与站点代码分开并不会给我们使用现有控制器方法的奢侈/诱惑。 :) 您是否考虑过为用户工厂使用的角色创建工厂?我不确定这在您的情况下会有多麻烦,或者您需要创建多少个角色。

      【讨论】:

      • 只有少数几个角色,我正在使用 FactoryGirl 来生成用户,所以这是可能的。请注意,我还没有检查 FactoryGirl 是否可以看到 access_levels,所以即使我确实走那条路,我也可能最终需要 Dave Schweisguth 的解决方案。
      • 如果你走FactoryGirl路线,你可以使用traits来设置你需要的访问级别参数吗?这可能是额外的工作,但它会使您的测试代码与您的应用程序分开。
      • 我可以使用特征,是的。我担心的是它们会使测试变得脆弱,因为程序使用的特征名称和索引之间的映射可能与测试使用的映射不同。如果我更改与某个名称匹配的索引,它应该只会破坏检查该映射的单元测试,但如果我使用 FG 特征,这样的更改会破坏几乎所有测试。
      猜你喜欢
      • 2014-01-11
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      相关资源
      最近更新 更多