我想知道是否可以使用Step Argument Conversion将字符串转换为另一个字符串。这是一个例子:
我有以下步骤:
When in element 'Element' I enter 'value'
这些步骤必须接受不同的数据,如数字,日期等。他们的定义是这样的:
[When(@"in element '(.*)' I enter '(.*)'")]
public void WhenIEnterInElement(string element, string value)
{
Enter(value, element);
}
我希望接受以下内容:
When in element "Element" I enter "today plus 3 days"
并使用Step Argument Conversion,如:
[StepArgumentTransformation(@"today plus (\d+) days")]
public string ConvertDate(int days)
{
return DateTime.Today.AddDays(days).ToString();
}
它无法正常工作,因为我正在尝试将字符串转换为srting,我是对的吗?使用Step Argument Conversion是不是有办法做到这一点?
答案 0 :(得分:3)
这听起来像真正想要的是重新格式化字符串,以便您可以限制自己使用单个绑定方法。
但是
SpecFlow可以执行以下转换(在以下优先级中):没有转换,如果参数是参数类型的实例(例如参数类型是对象或字符串) 步骤参数转换 标准转换
(来自https://github.com/techtalk/SpecFlow/wiki/Step-Argument-Conversions)
由于您的方法采用字符串参数,将不会使用stepargumenttransformations 。
您有2个选项
1)对每种数据类型使用转换,为每种类型使用方法绑定
[When(@"in element '(.*)' I enter '(.*)'")]
public void WhenIEnterInElement(string element, DateTime value)
{
Enter(value, element.ToString());
}
[StepArgumentTransformation(@"today plus (\d+) days")]
public DateTime ConvertDate(int days)
{
return DateTime.Today.AddDays(days);
}
2)包装string
以便能够重复使用不同的未解析数据的步骤绑定
public class WrappedString
{
public string Value;
public WrappedString(string value):Value(value) {}
}
[When(@"in element '(.*)' I enter '(.*)'")]
public void WhenIEnterInElement(string element, WrappedString value)
{
Enter(value, element.Value);
}
[StepArgumentTransformation(@"today plus (\d+) days")]
public WrappedString ConvertDate(int days)
{
return new WrappedString(DateTime.Today.AddDays(days).ToString());
}
1)可能更干净,但听起来你的情景基于能够操纵文本 - 在这种情况下(2)甚至可以帮助模拟该要求。