【问题标题】:How do I generate a List<T> in the step definition of a SpecFlow Scenario?如何在 SpecFlow 场景的步骤定义中生成 List<T>?
【发布时间】:2013-01-04 17:26:46
【问题描述】:

在 SpecFlow Step Definitions 的文档中,它显示了一个示例,您可以通过在场景中使用逗号分隔列表在步骤定义中创建一个列表:

例如:

鉴于我在“周二、周五、周日”有空

会导致:

@Given("I am available on \"(.+)\"")
public void I_have_cukes_in_my_belly(List<String> days) {
    // Do something with the days
}

不幸的是,当我这样做时,我得到了这个:

@Given("I am available on ""(.*)"")
public void I_have_cukes_in_my_belly(string days) {
    // Do something with the days
}

我正在使用 VS 2012 和 SpecFlow 1.9.1 版。有谁知道我可能做错了什么?或者我该如何解决这个问题?

提前致谢。

【问题讨论】:

    标签: c# visual-studio-2012 specflow


    【解决方案1】:

    你可以这样做:

    鉴于我这几天有空:

    | DaysOfWeek |

    |星期一 |

    |星期二 |

    |星期三 |

    然后您可以使用表格并将其转换为列表...

    @Given("I am available on these days:")
    public void I_have_cukes_in_my_belly(Table table) {
        List<string> days = new List<string>();
        foreach (var tableRow in table.Rows)
        {
            days.Add(tableRow["DaysOfWeek"]);
        }
     }
    

    【讨论】:

      【解决方案2】:

      目前似乎支持列表的唯一语言是 Java。我假设您在使用 VS2012 时使用 C#。如果您将链接页面上的代码示例切换到 C# 而不是 Java,List 示例就会消失,我会看到与您相同的行为。

      但是,您可以简单地将字符串作为参数并将其放入列表中。 1 行。

      C#

      [Given(@"I am available on ""(.*)""")]
      public void GivenIAmAvailableOn(string days)
      {
              List<String> daysList = new List<string>(days.Split(','));
      

      【讨论】:

      • 谢谢。我没有注意到网页上的语言选择。
      【解决方案3】:

      您可以尝试查询 Table 实例以获取您要查找的列表。

      expectedTable.Rows.Select(row => row.Values.FirstOrDefault()).ToList()
      

      【讨论】:

        【解决方案4】:

        如果您在Step Definitions 页面上单击C#,您将看到列表示例消失。但是,正如 OCary 指出的那样,您可以通过拆分字符串来模拟它。

        但我建议无需转换回列表,您可以通过 Linq 使用 IEnumerable,这样您就可以更简单地解析列表,即

        [Given(@"I am available on ""(.*)""")]
        public void GivenIAmAvailableOn(string days)
        {
            var daysList = from x in days.Split(',') select x.Trim();
        

        【讨论】:

          【解决方案5】:

          目前我正在使用步进参数转换来获得正确的列表:

          [StepArgumentTransformation(@"((?:.*)(?:,.*)*)")]
          public List<string> StringToList(string list)
          {
              // (
              //    (?:    - Don't capture
                       .*  - Match any character
              //    )
              //    (?:    - Don't capture
              //       ,   - Separated by a comma
              //       .*  - Match any character
              //    )*     - Zero or more items after the first item
              // )
          
              return list
                  .Split(',')
                  .Select(x => x.Trim())
                  .ToList();
          }
          

          然后您就可以使用List&lt;string&gt; 作为参数类型,如下所示:

          [Given(@"I am available on ""(.*)""")]
          public void GivenIAmAvailableOn(List<string> days)
          {
          }
          

          【讨论】:

            【解决方案6】:

            使用TableIEnumerable&lt;T&gt; 转换器:

            [StepArgumentTransformation]
            public static IEnumerable<string> ToStringEnumerable(Table table) =>
                table.Rows.Select(t => t.Values.Single());
            

            然后你可以像在你的例子中一样使用它(或者如果你愿意,可以转换为List&lt;T&gt;):

            @Given("I am available on \"(.+)\"")
            public void I_have_cukes_in_my_belly(IEnumerable<String> days) {
                // Do something with the days
            }
            

            【讨论】:

              猜你喜欢
              • 2015-07-25
              • 2017-03-28
              • 2016-02-04
              • 2016-02-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多