使用Step Argument Conversion在SpecFlow中格式化字符串

时间:2013-05-13 20:42:07

标签: c# specflow

我想知道是否可以使用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是不是有办法做到这一点?

1 个答案:

答案 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)甚至可以帮助模拟该要求。