3

我想知道是否可以使用 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"

并使用步骤参数转换,如:

    [StepArgumentTransformation(@"today plus (\d+) days")]
    public string ConvertDate(int days)
    {
        return DateTime.Today.AddDays(days).ToString();
    }

它不起作用,因为我正在尝试将字符串转换为 srting,对吗?没有办法通过步骤参数转换来做到这一点吗?

4

1 回答 1

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) 甚至可能有助于模拟该需求。

    于 2013-05-14T07:31:43.217 回答