首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >黄瓜特性文件可以从父功能文件“继承”吗?

问黄瓜特性文件可以从父功能文件“继承”吗?
EN

Stack Overflow用户
提问于 2017-01-26 11:23:11
回答 2查看 1.9K关注 0票数 0

我的项目有多个功能文件,不同的特性仍然共享相同的背景设置。目前,这些备份步骤被复制到特性文件中;如果我能够将这些常见步骤放在一个功能中,这将允许只指定一次步骤,并在“子”功能文件的开头指定这些步骤,并基本上停止对跨功能的后台步骤的繁琐复制。

从我的搜索中,我发现了对“步骤”定义的引用--我很可能错误地解释了这一点,但这不是吗:

代码语言:javascript
复制
steps %{
    When I go to the search form
    And I fill in "Query" with "#{query}"
    And I press "Search"
  }
end

只需复制步骤定义,这意味着我的特性看起来几乎与它们现在的方式相同(除了添加了‘步骤%{ .}’“)?

还是我想要的不可能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-26 20:03:55

简单的回答是没有。功能文件不能从其他功能文件继承。

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

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

我的方法是在堆栈中隐藏一些常见的东西,可能是一种复制。将其隐藏在步骤实现的某个地方。

你的情况可能不一样。

票数 3
EN

Stack Overflow用户

发布于 2017-01-30 11:55:48

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

这样做的方法是

  1. 说出你的共同背景。
  2. 使用该名称实现助手方法
  3. 在您的功能中包含一些与该名称相关的内容。
  4. 由于需要附加安装程序,请查找新名称,创建新方法,并让它们通过调用使用现有方法。

命名部分对功能很重要。剩下的是编程,在特性中没有位置。

让我们执行登录示例,假设我们已经具有注册用户和登录的功能。

代码语言:javascript
复制
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

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

秘诀是推动“如何”这样做,所以它在一个较低的层次,比步骤的定义。将此与命名相结合,您就可以处理任意级别的复杂性。

例如,让我们与注册客户打交道,重复订购他们每月的文具。

代码语言:javascript
复制
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_order、add_stock等方法。但是,如果您在实现这种行为时正在执行BDD,那么您将可以完成和使用大部分其他内容。

当我变小的时候,我想到的是一个等级

代码语言:javascript
复制
features
step definitions
step helpers
application

在这个堆栈中越深入,我就可以推送代码,这样我的体验就会越好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41872376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档