Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Specflow在具有场景上下文的表中使用参数_C#_.net_Bdd_Specflow_Gherkin - Fatal编程技术网

C# Specflow在具有场景上下文的表中使用参数

C# Specflow在具有场景上下文的表中使用参数,c#,.net,bdd,specflow,gherkin,C#,.net,Bdd,Specflow,Gherkin,我正在使用C#中的Specflow来使用Selenium构建自动客户端浏览器测试 这些测试的目标是模拟客户在特定页面中进入我们网站的业务场景, 然后他被引导到正确的页面 我想在场景上下文中使用参数, 例如: When I visit url | base | page | parameter1 | parameter2 | | http://www.stackoverflow.com | questions | &

我正在使用C#中的Specflow来使用Selenium构建自动客户端浏览器测试

这些测试的目标是模拟客户在特定页面中进入我们网站的业务场景, 然后他被引导到正确的页面

我想在场景上下文中使用参数, 例如:

When I visit url
 | base                         | page      | parameter1       | parameter2     |
 | http://www.stackoverflow.com | questions | <questionNumber> | <questionName> |
Then browser contains test <questionNumber>

Examples: 
    | <questionNumber> | <questionName> |
    | 123              | specflow-q1    |
    | 456              | specflow-q2    |
    | 789              | specflow-q3    |
当我访问url时
|基础|页面|参数1 |参数2|
| http://www.stackoverflow.com |问题| ||
然后浏览器包含测试
示例:
|  |  |
|123 | specflow-q1|
|456 | specflow-q2|
|789 | specflow-q3|
注意:步骤“当我访问url时”采用base+page+parameter1+parameter2,创建url“base/page/parameter1/parameter2”并转到此url

问题是,步骤“I访问url”中的输入表按原样传递文本,而没有修改示例部分中的等效项

这意味着上述语法生成的表中有一行包含参数名称的数据:

,问题,问题编号,问题名称

而不是使用它们的价值:

,问题,123,specflow-q1


您知道如何正确使用它吗?

不可能将数据表和场景大纲混合使用。相反,我将改写您的场景,如下所示:

When I visit the URL <base>/<page>/<questionNumber>/<questionName>
Then the browser contains test <questionNumber>

Examples: 
 | base                         | page      | questionNumber | questionName |
 | http://www.stackoverflow.com | questions | 123            | specflow-q1  |
 | http://www.stackoverflow.com | questions | 456            | specflow-q2  |
 | http://www.stackoverflow.com | questions | 789            | specflow-q3  |
当我访问URL时///
然后浏览器包含测试
示例:
|基本|页面|问题编号|问题名称|
| http://www.stackoverflow.com |问题| 123 | specflow-q1|
| http://www.stackoverflow.com |问题| 456 | specflow-q2|
| http://www.stackoverflow.com |问题| 789 | specflow-q3|
在“当我访问URL”步骤定义中,您将根据传入的表参数(您当前正在执行的操作)构造URL

虽然“示例”部分中重复了“基础”和“问题”值,但可以清楚地看到测试的确切内容。非技术用户(例如业务用户)也将能够轻松理解此测试试图实现的目标。

这现在是可能的(至少我正在使用SpecFlow v2.0进行此操作)

[当(@“当我访问url时”)]
访问时的公共无效(表)
{
var url=table.CreateInstance();
}
公共类UrlDTO{
公共字符串基{get;set;}
公共字符串页{get;set;}
公共字符串参数1{get;set;}
公共字符串参数2{get;set;}
}

Thank Adam的可能重复,问题确实类似,但尚未解决。我想,也许通过简化代码,问题会更清楚,希望有人会有好的建议。“不要修改示例部分中的对等词”-你这是什么意思?@Fresh-编辑问题以回答你的评论。谢谢。这听起来是一个很好的解决办法,问题是我已经用“我访问url”方法编写了很多测试,我不想再教育我的用户。你确定这是不可能的吗?@Wasafa1,我知道我是在长时间间隔后发表评论的,但是你的I-vist URL是一个通用步骤,你需要额外的步骤来创建URL,因为它有参数。此外,表格标题不能包含参数名称。我相信您可以重构或添加一个步骤来重用您已经编写的代码。
[When(@"When I visit url")]
public void WhenIVisitUrl(Table table)
{
  var url = table.CreateInstance<UrlDTO>();
}

public class UrlDTO{
  public string base { get;set; }
  public string page { get;set; }
  public string parameter1 { get;set; }
  public string parameter2 { get;set; }
}