首页 > 解决方案 > Specflow 允许可为空的表参数

问题描述

以下是场景中的示例步骤:

Given ...
...
When create ride ticket
    | hour | passangers | ... |
And create ride ticket rideNumber 3
...
Then ride is successful

(我保留了相关部分,没有必要了解场景是关于什么的)

通过此步骤实现:

[When(@"create\s*ride(?: rideNumber (.+))?")]
public void WhenCreateRide(int? rideNumber , Table rideDetails)
{
    ...
}

我将这个新的 Table 参数添加到步骤定义中。前面的逻辑从另一个步骤定义中获取了细节。我试图同时允许旧逻辑和新逻辑 - 将表直接传递给此步骤定义。

如果我删除了步骤的rideNumber 2 部分(就像在第一个When 语句中一样),上面的方法会将rideNumber 参数视为null(因为我将其标记为可为null)。但是,如果我根本不将表传递给场景-它将引发绑定异常。

我有很多(超过 100 个)使用这种旧逻辑的场景(因此他们没有传递给他们的表格),所以向所有场景添加一个表格似乎是我最不想做的事情。

知道如果我不通过它为什么不将表格视为 null 吗?知道如何克服这个问题吗?

标签: c#.netbddspecflow

解决方案


这些应该是单独的步骤定义,否则你会进入这种精确的情况。与创建两个单独的步骤定义相比,您将花费更多时间来尝试使其工作。在生成步骤定义时,您可能必须从 SpecFlow 建议的默认名称重命名步骤定义方法之一。

[When(@"create ride ticket rideNumber (.+)")]
public void WhenCreateRideWithNumber(int rideNumber)
{
    ...
}

[When(@"create ride ticket")]
public void WhenCreateRideTicket(Table rideDetails)
{
    ...
}

如果这两个步骤定义有共同的逻辑,创建一个包含共同逻辑的私有方法,然后从两个步骤定义中调用这个私有方法:

[When(@"create ride ticket rideNumber (.+)")]
public void WhenCreateRideWithNumber(int rideNumber)
{
    ...
    CreateRideTicket(...);
    ...
}

[When(@"create ride ticket")]
public void WhenCreateRideTicket(Table rideDetails)
{
    ...
    CreateRideTicket(...);
    ...
}

private void CreateRideTicket(...)
{
    // common logic
}

推荐阅读