我的项目有多个功能文件,其中不同的功能仍然共享相同的背景设置。目前,这些备份步骤将跨功能文件进行复制;如果我可以将这些常用步骤放在一个特征中,这将允许一次指定步骤并在“⊂”的开头指定它们。功能文件,基本上停止了功能背景步骤的繁琐复制。
在我的搜索中,我找到了对“步骤”的引用。定义 - 我可能错误地解释了这一点,但并不是这样:
steps %{
When I go to the search form
And I fill in "Query" with "#{query}"
And I press "Search"
}
end
只是复制步骤定义,这意味着我的功能看起来几乎与他们现在的方式相同(除了添加'步骤%{...}结束')?
或者我正在寻找的是不可能的?
答案 0 :(得分:2)
简短的回答,没有。功能文件无法从其他功能文件继承。
更长的答案是,如果您希望在许多不同的执行中进行常见设置,请考虑将设置隐藏在您的步骤委派给的助手类中。在许多情况下,步骤的实现是委托给实际执行工作的另一个对象。许多步骤只有一行。有些更长,但很少超过两三个。
常见的背景是登录系统。登录很重要,但通常可以隐藏在步骤中。利益相关者通常不关心这样的事情。他们倾向于关心商业行为。因此,像登录这样重复的事情往往只是噪音,可以安全地隐藏在抽象中。
我的方法是隐藏堆栈中的常见内容,可能是重复内容。将其隐藏在步骤实现中的某处。
您的情况可能有所不同。
答案 1 :(得分:1)
功能文件无法继承。您不应该尝试使用功能文件进行任何编程!
这样做的方法是
命名部分对功能很重要。其余的是编程,没有功能。
让我们做一下登录示例,假设我们已经拥有注册用户和登录的功能
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_order
,add_stock
等方法。但是,如果您在实施此行为时正在进行BDD,那么您将完成大部分其他工作并可供您使用。< / p>
当我的时候,我有一个层次结构,这是
features
step definitions
step helpers
application
在这个堆栈的下方,我可以推送能够做得更好的代码。