SpecFlow如何处理多个参数?

3
正如标题所说,SpecFlow如何处理这个问题
x = AddUp(2, 3)
x = AddUp(5, 7, 8, 2)
x = AddUp(43, 545, 23, 656, 23, 64, 234, 44)

我给出的链接是通常的做法。 我想知道顶部的注释应该是什么?

[Then(@"What should I write here")]
public static void AddUp(params int[] values)
{
   int sum = 0;
   foreach (int value in values)
   {
      sum += value;
   }
   return sum;
}

为什么你想要一个参数数组,而不只是一个数组参数呢?毕竟你自己永远不会调用这个方法,只有SpecFlow会调用。那么你期望与这个步骤相对应的特性文件是什么样子的呢?你还没有给出任何示例。 - Sam Holder
4个回答

5
我不相信在SpecFlow中可以自动使用参数数组作为参数类型的绑定。至少我从未尝试过,也没有见过这样的用法。
您想如何在特性文件中指定此内容?您已经给出了要调用的方法和您希望SpecFlow调用的步骤定义方法的示例,但并未说明您希望特性文件阅读的方式。
我怀疑您可能想要像这样做:
Given I want to add up the numbers 2,5,85,6,78

最终,SpecFlow将希望将此转换为字符串并调用方法。您将需要自己将字符串转换为数字数组,可能使用[StepArgumentTransformation]进行转换,如下所示:

[StepArgumentTransformation]
public int[] ConvertToIntArray(string argument)
{
    argument.Split(",").Select(x=>Convert.ToInt32(x)).ToArray();
} 

那么您应该能够这样定义您的步骤定义:

[Given(@"I want to add up the numbers (.*)")]
public static void AddUp(params int[] values)
{
    int sum = 0;
    foreach (int value in values)
    {
        sum += value;
    }
    return sum;
}

但是说实话,在这个时候你不需要 params 部分,int[] 就足够了。


3
您可以通过添加单引号来添加参数,例如:
[When(@"I perform a simple search on '(.*)'")]
public void WhenIPerformASimpleSearchOn(string searchTerm)
{
    var controller = new CatalogController();
    actionResult = controller.Search(searchTerm);
}

您可以使用逗号分隔的列表

When i login to a site
then 'Joe,Bloggs,Peter,Mr,Some street,15' are valid

您也可以使用表格值。
When I login to a site
then the following values are valid
    | FirstName | LastName | MiddleName | Greeting| Etc    | Etc     |
    | Joe       | Bloggs   | Peter      | Mr      | you get| The Idea|

https://github.com/techtalk/SpecFlow/wiki/Step-Definitions 如何为SpecFlow场景提供多个When语句 如何在SpecFlow中传递变量数组


1

这是我认为最好的解决方案:

When I add the following numbers
| Numbers|
| 5      |
| 1      |
| 3      |

和这个步骤

[When(@"I add the following numbers")]
public static void AddUp(Table values)
{
   //addition code
}

0
回答标题问题:SpecFlow解析Given规范中的正则表达式,所以如果你对正则表达式很熟悉,你可以做你需要的事情。对于两个整数参数,这将起作用:
[Given(@"the numbers are (\d+),(\d+)")]
public void GivenTheNumbersAre(int number1, int number2)

然而,您必须为每个捕获组定义一个参数。我知道的最简单的正则表达式是用于逗号分隔的整数列表,没有尾随逗号,它可以帮助我实现以下功能:
[Given(@"a list of numbers such as ((\d+,)+(\d+))")]
public void GivenAListOfNumbersSuchAs(string commaDelimitedIntegers, string most, string last)
    {

丢弃多余的最后两个参数,只解析第一个参数。
var numbers = commaDelimitedIntegers
            .Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries)
            .Select(int.Parse).ToArray();


这种方法与仅使用.+的正则表达式相比唯一的优势是,特征文件中的智能感知功能可以告诉您参数是否与正则表达式匹配。
如果您正在学习正则表达式,您可以通过控制台输出来检查您的内容。
var console = _scenarioContext.ScenarioContainer.Resolve<ISpecFlowOutputHelper>();
console.WriteLine(commaDelimitedIntegers);
console.WriteLine(most);
console.WriteLine(last.ToString());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接