【问题标题】:How to create complex object that has Private members with constructor in Specflow using Table如何使用 Table 在 Specflow 中创建具有带有构造函数的私有成员的复杂对象
【发布时间】:2016-05-06 01:01:48
【问题描述】:

我有以下功能,包括正在测试的步骤和课程。当我将 Name 字段的可见性更改为 public 时,我可以在 Table.CreateInstance<>() 之后检索该值,但将其设为私有时会失败。

场景:获取员工详细信息。

Given below employee create a user.
| Name | age |
| John | 28  |

代码

[Binding]
public class TableSteps
{
    [Given(@"below employee create a user\.")]
    public void GivenBelowEmployeeCreateAUser_(Table table)
    {
        Employee employee = table.CreateInstance<Employee>();
        Console.Write("Name:" + employee.Name); //Works as it is public.
        Console.Write("Name:"+ employee.EmpName); //No value returned here. Just null.
    }
}

public class Employee
{
    private string Name { get; set; } //not working.
    //public string Name { get; set; } //works.
    public int age { get; set; }

    public Employee(String Name, int age)
    {
        this.Name = Name;
        this.age = age;
    }
    public string EmpName
    {
        get { return Name; }
    }
}

【问题讨论】:

  • 顺便说一句,Name 应该是一个私有字段。 CreateInstance 是否真的通过构造函数传递数据?
  • 我是 Specflow 的新手。如何在specflow中使用CreateInstance传递值?

标签: c# specflow


【解决方案1】:

CreateInstance 只会设置公共值,因为它是它可以访问的所有值。

【讨论】:

    【解决方案2】:

    像这样:

    [Binding]
    public class TableSteps
    {
        [Given(@"below employee create a user\.")]
        public void GivenBelowEmployeeCreateAUser_(Table table)
        {
            Employee employee = new Employee(table.Rows[0][0], int.Parse(table.Rows[0][1]));
            Console.Write("Name:" + employee.Name); //Works as it is public.
            Console.Write("Name:"+ employee.EmpName); //No value returned here. Just null.
        }
    }
    

    如果你想让它更具可读性,你可以将它包装到一个扩展方法中,比如。

    Employee employee = table.CreateEmployee();
    

    但如果您想要一个通用的解决方案,那么您必须自己编写一个。

    不过应该​​不会太难,只需创建一个像 CreateInstance 这样的扩展方法,它接受一个对象参数数组,然后反映您正在创建的类型的构造函数以找到具有相同编号的构造函数参数作为方法被调用并使用传递的参数调用该构造函数。

    如果这些类只是用于测试,我会将它们公开,因为这是最简单的解决方案。

    【讨论】:

      【解决方案3】:

      这与SpecFlow and complex objects 类似,您可以创建一个类来充当您的 SpecFlow 表的“视图模型”:

      public class EmployeeRow
      {
          public string Name { get; set; }
          public int Age { get; set; }
      
          public Employee ToEmployee()
          {
              return new Employee(Name, Age);
          }
      }
      

      然后在你的步骤定义中:

      [Given(@"below employee create a user\.")]
      public void GivenBelowEmployeeCreateAUser_(Table table)
      {
          Employee employee = table.CreateInstance<EmployeeRow>().ToEmployee();
          Console.Write("Name:" + employee.Name);
          Console.Write("Name:"+ employee.EmpName);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-05
        相关资源
        最近更新 更多