在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版本。有谁知道我可能做错了什么?或者我如何解决这个问题?
提前致谢。
答案 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)
使用 Table
到 IEnumerable<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
}