Specflow 允许为 nullable Table 参数

Specflow allowing nullable Table parameter

这是场景中的示例步骤:

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 参数添加到步骤定义中。前面的逻辑从另一个步骤定义中获取了细节。 我正在尝试同时允许旧逻辑和新逻辑 - 将 Table 直接传递给此步骤定义。

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

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

知道如果我不通过它为什么不将 Table 视为 null 吗? 知道如何解决这个问题吗?

这些应该是单独的步骤定义,否则您会遇到这种情况。与创建两个单独的步骤定义相比,您将花费更多的时间来尝试让它发挥作用。在生成步骤定义时,您可能必须从 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
}