SpecFlow辅助 - 从表创建实例

Ale*_*x M 4 specflow

我正在尝试specFlow辅助,不知道如何从表创建类属性.想象一下,我有这堂课:

public class Tracking 
{
    public string Category { get; set; }
}

public class ODARequest
{
    public string Title { get; set; }
    public string Name { get; set; }
    public Tracking Tracking { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的给定场景是下一个:

Scenario: Successfully create an account
Given I have entered the following data into the ODA form:
    | Field                  | Value            |
    | Title                  | Mr               |
    | Name                   | Andy             |
    | Tracking Category      | MDA              |


public void GivenIHaveEnteredTheFollowingDataIntoTheODAForm(Table table)
{
    var request = table.CreateInstance<ODARequest>();
}
Run Code Online (Sandbox Code Playgroud)

不会填充"跟踪"属性.任何人都知道如何Tracking.Category在表中描述这种情况?

per*_*ist 5

我无法找到一种方法来获取specflow以将"CreateInstance"映射到非标准数据类型属性.

但是,在这种情况下,您至少可以使用StepArgumentTransformation如下:

    [Given(@"I have entered the following data into the ODA form:")]
    public void GivenIHaveEnteredTheFollowingDataIntoTheODAForm(ODARequest request)
    {
        Assert.IsNotNull(request.Tracking);
    }

    [StepArgumentTransformation(@".*")]
    public ODARequest StringToTracking(Table input)
    {
        return new ODARequest() { 
            Title = input.Rows.Single(row => row["Title"])["value"],
            Name = input.Rows.Single(row => row["Name"])["value"],
            Tracking = new Tracking() 
                { Category = input.Rows.Single(row => row["Field"] == "Tracking Category")["Value"] }
            };
    }
Run Code Online (Sandbox Code Playgroud)

通过一些工作,你可以整理stepargumenttransformation以接受每个参数作为可选(而不是如果省略则抛出"single()").

我觉得应该有更好的方法来做到这一点,更像是你原来建议的代码.希望这是有帮助的.


val*_*nvs 3

我一直在遇到这个问题,并思考如何一步到位

Scenario: Successfully create an account
Given I have entered the following data into the ODA form:
    |Title | Name | Category|
    | Mr   | Andy | MDA     |

public void GivenIHaveEnteredTheFollowingDataIntoTheODAForm(Table table)
{
    var request = table.CreateInstance<ODARequest>();
    request.Tracking = table.CreateInstance<Tracking>();
}
Run Code Online (Sandbox Code Playgroud)

工作原理:您可以为您拥有的每个复杂属性调用“CreateInstance”,这样specflow将为您创建一个实例。因此,您可以拥有一个包含不同类型属性的表。

通过这样做,您将不需要不同的步骤,也不需要在步骤之间共享数据。

缺点是,如果您的类具有许多不同类型的属性,您最终可能会得到一个巨大的表。

注意:正如 @Alex M 评论的那样,当类具有同名属性时存在风险。实际上会发生的是,由于两个类的属性名称匹配,两个实例将获得相同的值。