C# 如何处理SpecFlow中没有标题的表?

C# 如何处理SpecFlow中没有标题的表?,c#,.net,ruby,specflow,gherkin,C#,.net,Ruby,Specflow,Gherkin,在Ruby中使用Gherkin之后,我想看看C#NET上的SpecFlow是否适合我。在Ruby中,我能够处理第一列中包含字段,第二列中包含值的表,如下所示: Then I see a summary of details in the overview page | Service | Taxi | | Arrival Station | Middlebourg | | Arrival Vehicle | SAT12901 | | Arrival

在Ruby中使用Gherkin之后,我想看看C#NET上的SpecFlow是否适合我。在Ruby中,我能够处理第一列中包含字段,第二列中包含值的表,如下所示:

Then I see a summary of details in the overview page
| Service           | Taxi        |
| Arrival Station   | Middlebourg |
| Arrival Vehicle   | SAT12901    |
| Arrival Date      | 27/06/2014  |
| No of Passengers  | 2           |
foreach(var row in table.Rows)
{
   var first = row[0];
   var second = row[1];
   ... use the values ...
}
public static IEnumerable<TableRow> AllRows(this Table table)
{
     yield return new TableRow(table, table.Header);
     foreach(var row in table.Rows)
     {
         yield return row;
     }
 }
在SpecFlow中,我可以使用TechTalk.SpeclFlow.Table对象,该对象具有以下功能:

  • CreateInstance:假设“服务”和“出租车”不是标题
  • CreateSet:也忽略第一行并返回键/值对。也不起作用

当然,这里的一项工作是更改我的表的布局,以匹配SpecFlow的表对象的工作。但是有没有其他选择,比如Ruby中的“rows\u hash”函数?谢谢

看来SpecFlow总是假定一个头。您可以通过以下方式访问此标题:

table.Header
获取标题的原始访问权限。这只是字符串的集合,因此您可以通过以下方式访问各个元素:

var firstRowFirstColumn = table.Header[0];
var firstRowSecondColumn = table.Header[1]; 
然后,您可以通过如下方式访问表中剩余的各行:

Then I see a summary of details in the overview page
| Service           | Taxi        |
| Arrival Station   | Middlebourg |
| Arrival Vehicle   | SAT12901    |
| Arrival Date      | 27/06/2014  |
| No of Passengers  | 2           |
foreach(var row in table.Rows)
{
   var first = row[0];
   var second = row[1];
   ... use the values ...
}
public static IEnumerable<TableRow> AllRows(this Table table)
{
     yield return new TableRow(table, table.Header);
     foreach(var row in table.Rows)
     {
         yield return row;
     }
 }
获取表中所有其他值的步骤

如果您想要无头的原始访问,我将创建如下扩展方法:

Then I see a summary of details in the overview page
| Service           | Taxi        |
| Arrival Station   | Middlebourg |
| Arrival Vehicle   | SAT12901    |
| Arrival Date      | 27/06/2014  |
| No of Passengers  | 2           |
foreach(var row in table.Rows)
{
   var first = row[0];
   var second = row[1];
   ... use the values ...
}
public static IEnumerable<TableRow> AllRows(this Table table)
{
     yield return new TableRow(table, table.Header);
     foreach(var row in table.Rows)
     {
         yield return row;
     }
 }
公共静态IEnumerable AllRows(此表)
{
收益返回新TableRow(表、表、表头);
foreach(表中的变量行。行)
{
收益返回行;
}
}

我不知道您是否可以创建这样的
TableRow
(看起来应该可以从源代码中创建),并且您可能需要创建自己的
TableRow
对象来包装specflow
TableRow
,但您应该明白了。

谢谢Sam!事实上,这在一定程度上起了作用。Rows属性跳过表的第一行(假定它是标题)。foreach中的第一行将返回列“Arrival Station”和“Middlebourg”。我可以用桌子。前往“服务”和“出租车”。很酷,很高兴它帮助您找到了解决方案。我将更新答案以包含您提供的信息谢谢!将其标记为已接受的答案。坚如磐石的解决方案似乎只是简单地在表中插入“| field | value |”。添加了一个扩展方法,该方法无需添加列标题即可提供所需内容。这是未经测试,可能需要一些调整,但我认为应该在正确的方向。