Specflow的可选参数

时间:2012-04-23 13:08:50

标签: c# bdd specflow

我如何才能最好地处理这样一个事实:我的许多步骤应该将0,1或甚至2个日期作为“第一个参数”?例如,我如何最好地支持Specflow

中的可选参数

最简单的情况是,只要步骤发生在彼此之后,日期就无关紧要了

 Given Peter was born 23-06-1973
 And Peter created an account
 And Peter deposited $200

通常,很多步骤都与时间有关,例如

 Given Peter was born 23-06-1973
 And at 1-4-2012 Peter created an account
 And at 13-4-2012 Peter deposited $200

在其他时间有两个日期,例如实时日期和发生事件的日期。例如。彼得填写了14-4-2012的印刷表格以进行汇款,但表格已经丢失了几天,我们今天需要记录表格已在几天前填写。

 Given Peter was born 23-06-1973
 ...
 And at 16-4-2012 really at 14-4-2012 Completed a transfer form to transfer $100 to account 12345 

3 个答案:

答案 0 :(得分:5)

我脑海中浮现出两件事:

首先,我现在不用担心很多步骤定义,只要它们很短(oneliners)并调用某种自动化层或DSL来帮助我自动化测试系统。请参阅此excellent presentation获取灵感。

因此,在这种意义上,您可以将每个案例的“重载”加倍步骤定义。

我对第二个解决方案的第一个尝试是将属性堆叠在彼此之上以获得相同的方法。这有效,但不适用于可选参数。 (并且可选参数不能与引用类型一起使用,因为DateTime,但DateTime?nullable工作)。 如果你像这样加紧步骤,你会收到如下错误:

  

参数计数不匹配!绑定方法'Class1.MyGiven(Int32,Int32,Int32)'应该有1个参数

所以我回到我的第一个解决方案:

    [Given(@"case one with one int '(\d+)'")]
    public void Case1(int a)
    {
        // Short but sweet step definition that calls into automation layer
    }

    [Given(@"case one with two ints '(\d+)' and '(\d+)'")]
    public void Case2(int a, int b)
    {
        // Short but sweet step definition that calls into automation layer
    }

    [Given(@"case one with three ints '(\d+)' and '(\d+)' and also '(\d+)'")]
    public void Case3(int a, int b , int c)
    {
        // Short but sweet step definition that calls into automation layer
    }

我希望我来回走动不会引起太多混乱。对不起 - 公共汽车上没有准备好IDE:)

答案 1 :(得分:4)

我更喜欢简单的多个步骤,但如果你想做你提出的建议,你需要制作一个合适的正则表达式。像(未经测试)的东西:

[Given(@"(at ([0-9-]+) (really at ([0-9-]+) |)|)(\w+) Completed a transfer form to transfer \$(\d+) to account (\d+)"]
public void TransferStep(string dummy1, DateTime? atDate, string dummy2, DateTime? reallyAtDate, string name, decimal amount, int account)

答案 2 :(得分:2)

这对我很有用,重载了需要可选参数和传入默认值的函数。

如果specflow支持可选参数,那将是很好的,例如string searchTerm = "" 但目前还没有

[When(@"I request a list of managers")]
public void WhenIRequestAListOfManagers()
{
    WhenIRequestAListOfManagers("");
}

[When(@"I request a list of managers with the search term (.*)")]
public void WhenIRequestAListOfManagers(string searchTerm)
{
   //do stuff
}