黄瓜功能文件可以继承'从父功能文件?

时间:2017-01-26 11:23:12

标签: inheritance cucumber

我的项目有多个功能文件,其中不同的功能仍然共享相同的背景设置。目前,这些备份步骤将跨功能文件进行复制;如果我可以将这些常用步骤放在一个特征中,这将允许一次指定步骤并在“⊂”的开头指定它们。功能文件,基本上停止了功能背景步骤的繁琐复制。

在我的搜索中,我找到了对“步骤”的引用。定义 - 我可能错误地解释了这一点,但并不是这样:

steps %{
    When I go to the search form
    And I fill in "Query" with "#{query}"
    And I press "Search"
  }
end

只是复制步骤定义,这意味着我的功能看起来几乎与他们现在的方式相同(除了添加'步骤%{...}结束')?

或者我正在寻找的是不可能的?

2 个答案:

答案 0 :(得分:2)

简短的回答,没有。功能文件无法从其他功能文件继承。

更长的答案是,如果您希望在许多不同的执行中进行常见设置,请考虑将设置隐藏在您的步骤委派给的助手类中。在许多情况下,步骤的实现是委托给实际执行工作的另一个对象。许多步骤只有一行。有些更长,但很少超过两三个。

常见的背景是登录系统。登录很重要,但通常可以隐藏在步骤中。利益相关者通常不关心这样的事情。他们倾向于关心商业行为。因此,像登录这样重复的事情往往只是噪音,可以安全地隐藏在抽象中。

我的方法是隐藏堆栈中的常见内容,可能是重复内容。将其隐藏在步骤实现中的某处。

您的情况可能有所不同。

答案 1 :(得分:1)

功能文件无法继承。您不应该尝试使用功能文件进行任何编程!

这样做的方法是

  1. 说出您的常见背景。
  2. 使用该名称实施帮助方法
  3. 在您的功能中包含引用该名称的内容
  4. 当您需要其他设置时,找到新名称,创建新方法并让他们通过调用
  5. 使用现有方法

    命名部分对功能很重要。其余的是编程,没有功能。

    让我们做一下登录示例,假设我们已经拥有注册用户和登录的功能

    Scenario: Users can see their previous orders
      Given I am signed in
      When I view my orders
      Then I should see my orders
    
    # steps
    Given 'I am signed in' do
      sign_in user: @i
    end
    
    # Helper methods
    module SignInStepHelper
      def sign_in(user:)
        register(user)
        ...
      end
    end
    World SignInStepHelper
    

    现在,您可以将此模式应用于任何复杂程度,因为一旦您进入堆栈的模块部分,您就会使用编程语言,并且在这里您可以将任何级别的复杂性编程到单个方法调用中。

    秘诀在于推动'如何'这样做,因此它的步骤低于步骤定义。将其与命名相结合,您可以处理任何级别的复杂性。

    例如,让我们处理注册客户的月度文具重复订单

    Scenario: Repeat order of monthly stationery
    
    Given I am registered
    And I have a monthly stationery order
    When I repeat my monthly order
    Then I should see my order in the checkout
    And I should see my previous orders
    
    # some steps
    Given 'I have a monthly stationery order' do
      create_monthly_order(
        products: stationery_order,
        user: @i
      )
    end
    
    # implementation
    module OrdersStepHelper
      def create_monthly_order(products:, user:)
        ...
      end
    
      def stationery_products
       [
         ...
      end
    end
    

    现在显然需要更多的代码才能完成这项工作,但由于这是在步骤定义下面的,所以这只是简单的编程。因此,您需要stationery_orderadd_stock等方法。但是,如果您在实施此行为时正在进行BDD,那么您将完成大部分其他工作并可供您使用。< / p>

    当我的时候,我有一个层次结构,这是

    features
    step definitions
    step helpers
    application
    

    在这个堆栈的下方,我可以推送能够做得更好的代码。