我的项目有多个功能文件,不同的特性仍然共享相同的背景设置。目前,这些备份步骤被复制到特性文件中;如果我能够将这些常见步骤放在一个功能中,这将允许只指定一次步骤,并在“子”功能文件的开头指定这些步骤,并基本上停止对跨功能的后台步骤的繁琐复制。
从我的搜索中,我发现了对“步骤”定义的引用--我很可能错误地解释了这一点,但这不是吗:
steps %{
When I go to the search form
And I fill in "Query" with "#{query}"
And I press "Search"
}
end只需复制步骤定义,这意味着我的特性看起来几乎与它们现在的方式相同(除了添加了‘步骤%{ .}’“)?
还是我想要的不可能?
发布于 2017-01-26 20:03:55
简单的回答是没有。功能文件不能从其他功能文件继承。
更长的答案是,如果您想要在许多不同的执行中执行公共设置,请考虑将设置隐藏在您的步骤委托给的helper类中。在许多情况下,步骤的实现是对实际执行工作的另一个对象的委托。许多步骤只有一行长。有些更长,但很少超过两三个。
一个常见的背景是登录到系统中。登录很重要,但通常可以隐藏在步骤中。利益相关者通常不关心这样的事情。他们倾向于关心商业行为。因此,重复的事情,如登录,往往只是噪音,可以安全地隐藏在一个抽象。
我的方法是在堆栈中隐藏一些常见的东西,可能是一种复制。将其隐藏在步骤实现的某个地方。
你的情况可能不一样。
发布于 2017-01-30 11:55:48
功能文件无法继承。您不应该尝试使用任何功能文件进行编程!
这样做的方法是
命名部分对功能很重要。剩下的是编程,在特性中没有位置。
让我们执行登录示例,假设我们已经具有注册用户和登录的功能。
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,那么您将可以完成和使用大部分其他内容。
当我变小的时候,我想到的是一个等级
features
step definitions
step helpers
application在这个堆栈中越深入,我就可以推送代码,这样我的体验就会越好。
https://stackoverflow.com/questions/41872376
复制相似问题