【问题标题】:Optional parameters with SpecflowSpecflow 的可选参数
【发布时间】:2019-02-02 00:07:04
【问题描述】:

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

【问题讨论】:

    标签: c# bdd specflow


    【解决方案1】:

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

    首先,我现在不必担心有大量步骤定义,只要它们很短(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 :)

    【讨论】:

    • 我希望可以重构可选日期,因为它将适用于大多数规则...
    • 没有关注你...你是什么意思“重构”?
    • 假设你有 100 个步骤,用你的方法我需要定义 300 个步骤.. 而我希望部分步骤可以归结为一些参数子字符串解析器
    • 啊啊——好主意。也许你可以使用 StepArgumentTransformation - 看看这个; github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions - 如果您创造性地使用它,您也许可以将所有这些方法缩减到一小部分。
    • 是的,我知道这一点,但是如何将它与 0,1 或 2 个 args 一起使用。因此我在这里写了 :)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案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
      }
      

      【讨论】:

      • 我刚刚测试过,SpecFlow 2.4 确实支持可选参数。
      • 很高兴知道@DdW 随时创建一个新的答案并从这里链接到它,以便人们知道他们是否使用了更新的版本。
      • 您的回答确实包含了我要发布的内容,先生,这是您的荣幸。
      • 太客气了,先生,太客气了:-)
      猜你喜欢
      • 2017-02-26
      • 1970-01-01
      • 2020-04-03
      • 2020-03-16
      • 1970-01-01
      • 2014-06-14
      • 2013-06-14
      • 2012-01-30
      • 1970-01-01
      相关资源
      最近更新 更多