具有规范流的可选参数

本文关键字:参数 范流 | 更新日期: 2023-09-27 18:32:03

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

具有规范流的可选参数

我脑海中浮现出两件事:

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

因此,从这个意义上说,您可以为每种情况使用"重载"将步骤定义加倍。

我对第二个解决方案的第一次尝试是将属性堆叠在同一方法上。这有效,但不适用于可选参数。(可选参数不适用于 DateTime 等引用类型,但 DateTime? 可为空)。如果你像这样加快你的步骤,你会收到这样的错误:

参数计数不匹配!绑定方法 '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,:)

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

[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)

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

如果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
}