【发布时间】:2014-06-06 18:09:33
【问题描述】:
我正在尝试在两个不同的步骤中将 SpecFlow 步骤参数转换为相同的返回类型。
这是简化的功能文件:
Feature: TransforMe
@UseTableToIntsTransform
Scenario: First
Given I have some condition
When I do something
Then the results should be
| Index |
| 1 |
| 2 |
| 3 |
@UseStringToIntsTransform
Scenario Outline: Second
Given I have some condition
When I do something
Then the results should contain <expectedResults>
Examples:
| expectedResults |
| 0 |
| 0,3,5,7,10 |
我要做的是从 Then 步骤中的场景转换 Table 和 string 以将 IEnumerable 作为 step 参数返回。我正在尝试使用范围,属性正则表达式限制,......没有成功。以下是步骤定义:
[Binding]
public class TransforMeSteps
{
[Given(@"I have some condition")]
public void GivenIHaveSomeCondition()
{ }
[When(@"I do something")]
public void WhenIDoSomething()
{ }
[Then(@"the results should be")]
[Scope(Scenario = "First", Tag = "UseTableToIntsTransform")]
public void ThenTheResultsShouldBe(IEnumerable<int> results)
{
results.ToList().ForEach(x => Debug.WriteLine(x));
}
[Then(@"the results should contain (.*)")]
[Scope(Scenario = "Second", Tag = "UseStringToIntsTransform")]
public void ThenTheResultsShouldContain(IEnumerable<int> results)
{
results.ToList().ForEach(x => Debug.WriteLine(x));
}
}
[Binding]
[Scope(Scenario = "First", Tag = "UseTableToIntsTransform")]
public class TableToIntsTransform
{
[StepArgumentTransformation(@"the results should be")]
public IEnumerable<int> TableToInts(Table intsTable)
{
return new List<int> { 1, 2, 3 };
}
}
[Binding]
public class StringToIntsTransform
{
[StepArgumentTransformation(@"the results should contain (.*)")]
[Scope(Scenario = "Second", Tag = "UseStringToIntsTransform")]
public IEnumerable<int> StringToInts(string integersString)
{
return new List<int> { 4, 5, 6 };
}
}
对于“第一个”场景,我得到了绿色测试,但有警告:多步转换与输入匹配(| 索引 | | 1 | | 2 | | 3 | ,目标类型:[System.Collections.Generic.IEnumerable`1[System.Int32]])。我们使用第一个。
对于“第二个”场景,抛出 InvalidCastException:Invalid cast from 'System.String' to 'System.Collections.Generic.IEnumerable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral , PublicKeyToken=b77a5c561934e089]]'。
每个转换都通过相应的步骤定义自行工作。例如,如果我将转换类的顺序更改为首先具有 StringToIntsTransform,那么“第二”场景的测试是绿色的。
那么我如何正确地指示或限制正确转换的范围?
我希望有这样的东西作为我的最终解决方案:
[Then(@"the results should contain (.*)")]
[Then(@"the results should be")]
public void ThenTheResultsShouldContain(IEnumerable<int> results)
{
results.ToList().ForEach(x => Debug.WriteLine(x));
}
所以只有一步定义。
【问题讨论】:
标签: specflow