SpecFlow步骤的布尔参数

时间:2013-04-24 14:52:28

标签: c# specflow

在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
    }
}

但我无法知道如何,这是可能的,如果是这样的话?

3 个答案:

答案 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. 导航到登录页面,以有效用户身份登录
  2. 导航至第1步
  3. 填写有效输入的字段,点击“下一步”
  4. 点击“下一步”
  5. 您只需要确保每个步骤尽可能独立于其他步骤,因此您可以使用略微不同的步骤替换一个步骤(对于新方案),而不会影响其他步骤。

    使用这种方法,您仍然可以得到复杂(并且可能非常详细)的方案,但我认为这比尝试聪明并将其打包到单个步骤定义中更好。您可能最终会遇到不可读的情况,并且代码可能也很难阅读/维护。

答案 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语句,而是实际上要分开步骤。