黄瓜特征文件 'inherit' 可以来自父特征文件吗?
Can a cucumber feature file 'inherit' from a parent feature file?
我的项目有多个功能文件,其中不同的功能仍然共享相同的背景设置。目前,这些备份步骤在功能文件中被复制;如果我可以将这些通用步骤放在单个功能中,这将允许指定一次步骤并将它们指定在 'sub' 功能文件的开头,并且基本上停止跨功能重复繁琐的后台步骤。
根据我的搜索,我找到了对 'steps' 定义的引用 - 我可能错误地解释了这个,但不是这样的:
steps %{
When I go to the search form
And I fill in "Query" with "#{query}"
And I press "Search"
}
end
只需复制步骤定义,这意味着我的功能看起来与他们刚才的方式几乎相同(除了添加 'Steps %{ ...}end')?
或者我正在寻找的是不可能的?
简短的回答,没有。功能文件不能从另一个功能文件继承。
较长的答案是,如果您有希望在许多不同的执行中发生的通用设置,请考虑将设置隐藏在助手 class 您的步骤委托给中。在许多情况下,步骤的实现是对实际执行工作的另一个对象的委托。许多步骤只有一行。有些更长,但很少超过两三个。
一个常见的后台就是登录系统。登录很重要,但它通常可以隐藏在步骤中。利益相关者通常不关心这样的事情。他们倾向于关心商业行为。因此,重复登录之类的事情对他们来说通常只是噪音,可以安全地隐藏在抽象中。
我的方法是将常见的东西(可能是重复的)隐藏在堆栈中。将其隐藏在步骤实现中的某处。
您的情况可能有所不同。
功能文件不能继承。您不应该尝试使用功能文件进行任何编程!
这样做的方法是
- 说出你们的共同背景是做什么的。
- 使用该名称实现辅助方法
- 在您的功能中包含引用该名称的内容
- 如果您需要额外的设置,请查找新名称、创建新方法并让它们通过调用使用现有方法
命名部分对功能很重要。剩下的就是编程,在功能中没有位置。
假设我们已经具备注册用户和登录的功能,让我们来做登录示例
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
现在您可以将此模式应用于任何级别的复杂性,因为一旦您到达堆栈的模块部分,您就处于一种编程语言中,在这里您可以将任何级别的复杂性编程为单个方法调用。
秘诀在于推动 'HOW' 你这样做,使其处于比步骤定义更低的级别。将其与命名相结合,您可以处理任何级别的复杂性。
例如,让我们处理重复订购每月文具的注册客户
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,那么您将完成大部分其他工作并可供您使用。
在拼接时我有一个层次结构,即
features
step definitions
step helpers
application
这个堆栈越往下,我可以推送执行某些操作的代码,我的体验就越好。
我的项目有多个功能文件,其中不同的功能仍然共享相同的背景设置。目前,这些备份步骤在功能文件中被复制;如果我可以将这些通用步骤放在单个功能中,这将允许指定一次步骤并将它们指定在 'sub' 功能文件的开头,并且基本上停止跨功能重复繁琐的后台步骤。
根据我的搜索,我找到了对 'steps' 定义的引用 - 我可能错误地解释了这个,但不是这样的:
steps %{
When I go to the search form
And I fill in "Query" with "#{query}"
And I press "Search"
}
end
只需复制步骤定义,这意味着我的功能看起来与他们刚才的方式几乎相同(除了添加 'Steps %{ ...}end')?
或者我正在寻找的是不可能的?
简短的回答,没有。功能文件不能从另一个功能文件继承。
较长的答案是,如果您有希望在许多不同的执行中发生的通用设置,请考虑将设置隐藏在助手 class 您的步骤委托给中。在许多情况下,步骤的实现是对实际执行工作的另一个对象的委托。许多步骤只有一行。有些更长,但很少超过两三个。
一个常见的后台就是登录系统。登录很重要,但它通常可以隐藏在步骤中。利益相关者通常不关心这样的事情。他们倾向于关心商业行为。因此,重复登录之类的事情对他们来说通常只是噪音,可以安全地隐藏在抽象中。
我的方法是将常见的东西(可能是重复的)隐藏在堆栈中。将其隐藏在步骤实现中的某处。
您的情况可能有所不同。
功能文件不能继承。您不应该尝试使用功能文件进行任何编程!
这样做的方法是
- 说出你们的共同背景是做什么的。
- 使用该名称实现辅助方法
- 在您的功能中包含引用该名称的内容
- 如果您需要额外的设置,请查找新名称、创建新方法并让它们通过调用使用现有方法
命名部分对功能很重要。剩下的就是编程,在功能中没有位置。
假设我们已经具备注册用户和登录的功能,让我们来做登录示例
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
现在您可以将此模式应用于任何级别的复杂性,因为一旦您到达堆栈的模块部分,您就处于一种编程语言中,在这里您可以将任何级别的复杂性编程为单个方法调用。
秘诀在于推动 'HOW' 你这样做,使其处于比步骤定义更低的级别。将其与命名相结合,您可以处理任何级别的复杂性。
例如,让我们处理重复订购每月文具的注册客户
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,那么您将完成大部分其他工作并可供您使用。
在拼接时我有一个层次结构,即
features
step definitions
step helpers
application
这个堆栈越往下,我可以推送执行某些操作的代码,我的体验就越好。