9

我如何最好地处理我的许多步骤应该将 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

在其他时候,有两个日期,例如实时日期和发生某事的日期。例如。Peter 填写了一份 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 
4

3 回答 3

6

有两件事突然出现在我的脑海中:

首先,我现在不必担心有大量步骤定义,只要它们很短(oneliners)并调用某种自动化层或 DSL 来帮助我自动化被测系统。请参阅此出色的演示文稿以获取灵感。

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

我对第二种解决方案的第一次尝试是使用相同的方法将属性堆叠在一起。这有效,但不适用于可选参数。(并且可选参数不适用于 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 :)

于 2012-04-24T06:58:28.440 回答
5

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

[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)
于 2012-05-02T12:29:38.973 回答
3

这对我来说效果很好,重载了需要可选参数并传入默认值的函数。

如果 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
}
于 2014-04-01T13:47:13.723 回答