如何在SpecFlow场景的步骤定义中生成List <t>?</t>

时间:2013-01-04 17:26:47

标签: visual-studio-2012 specflow

在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版本。有谁知道我可能做错了什么?或者我如何解决这个问题?

提前致谢。

6 个答案:

答案 0 :(得分:2)

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

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

C#

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

答案 1 :(得分:2)

您可以执行以下操作:

  

鉴于我在这些日子可以使用:

     

| 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 :(得分:1)

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

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

答案 3 :(得分:0)

如果您点击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();

答案 4 :(得分:0)

目前,我正在使用步骤参数转换来使列表正确:

[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<string>作为参数类型,如下所示:

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

答案 5 :(得分:0)

使用 TableIEnumerable<T> 转换器:

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

然后您可以像在您的示例中一样使用它(如果您愿意,也可以将其转换为 List<T>):

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