在SpecFlow中,我想检查步骤定义中是否存在字符串,此时我正在做一些笨重的事情,例如这个人为的例子:
[Given(@"Foo ( bar)?")]
public void GivenFoo(string bar)
{
if (bar == " bar")
{
// do bar
}
}
但是,我想做这样的事情:
[Given(@"Foo ( bar)?")]
public void GivenFoo(bool bar)
{
if (bar)
{
// do bar
}
}
但我无法知道如何,这是可能的,如果是这样的话?
答案 0 :(得分:1)
根据您的问题和对Jakub的回答的评论,看起来您正在尝试编写一个可以涵盖您网站的多个用户旅程的步骤。 SpecFlow并非真正为此设计,它可能表明您应该尝试改进场景/功能的结构。
要直接回答您的问题,我认为没有办法根据步骤定义中某些字符串的存在推断出布尔值。
如果你想坚持这条路线,那么你原来的例子可能是你最好的选择。
我建议您不采用这种方法,而是考虑重构步骤定义,以便将它们链接在一起,并在各个方案中重复使用它们。我实际上正在努力想出一个适合您解决方案的示例步骤定义。
多步骤方法的示例可能如下所示:
Given I have logged in as an existing user //1
And I have started my 6-step registration process //2
And I have filled in valid address values on step 1 //3
And I have left the fields blank on step 2 //4
... etc
When I save my registration
您的步骤将是:
您只需要确保每个步骤尽可能独立于其他步骤,因此您可以使用略微不同的步骤替换一个步骤(对于新方案),而不会影响其他步骤。
使用这种方法,您仍然可以得到复杂(并且可能非常详细)的方案,但我认为这比尝试聪明并将其打包到单个步骤定义中更好。您可能最终会遇到不可读的情况,并且代码可能也很难阅读/维护。
答案 1 :(得分:1)
你绝对可以使用StepArgumentTransformation
方法做同样的事情。您仍然必须编写解析器逻辑,但是您可以将其隔离到一个方法中,该方法的唯一目的是执行该解析。
示例功能文件:
Feature: I win if I am Batman
Scenario: Happy
Given I am the Batman
Then I defeat the Joker
Scenario: Sad
Given I am not the Batman
Then I am defeated by the Joker
Specflow Bindings(C#):
[Binding]
public class IWinIfIAmBatmanFeature
{
private bool iAmBatman;
[StepArgumentTransformation(@"(am ?.*)")]
public bool AmToBool(string value)
{
return value == "am";
}
[Given(@"I (.*) the Batman")]
public void WhoAmI(bool amIBatman)
{
iAmBatman = amIBatman;
}
[StepArgumentTransformation(@"(defeat|am defeated by)")]
public bool WinLoseToBool(string value)
{
return value == "defeat";
}
[Then(@"I (.*) the Joker")]
public void SuccessCondition(bool value)
{
Assert.AreEqual(iAmBatman, value);
}
}
关键因素是Given
子句中的正则表达式匹配与步骤参数变换匹配。所以在I (.*) the Batman
中,如果捕获与StepArgumentTransformation的参数中的正则表达式匹配,就像它在AmToBool
的属性中那样,那么这就是使用的转换。
答案 2 :(得分:0)
您在寻找:
[Given(@"I do something (times) times")]
public void GivenIDoSomething(int times)
{
}
否则这似乎就足够了
[Given(@"I do something twice")]
public void GivenIDoSomethingTwice()
{
}
修改
我认为在步骤中您不需要if
语句,而是实际上要分开步骤。