对参数化的MSTest使用自定义类型

时间:2018-07-19 15:51:29

标签: c# unit-testing testing mstest parameterized-unit-test

我正在创建单元测试,并且想要使用自定义类型(如dto)创建参数化测试。

我想做这样的事情:

[TestMethod]
[DataRow(new StudentDto { FirstName = "Leo", Age = 22 })]
[DataRow(new StudentDto { FirstName = "John" })]
public void AddStudent_WithMissingFields_ShouldThrowException(StudentDto studentDto) {
    // logic to call service and do an assertion
}
  1. 这是您可以做的事情吗?我收到一个错误消息:“属性参数必须是一个常量表达式...”我想我看到某个地方属性只能将原始类型作为参数?
  2. 这是错误的方法吗?我应该只传递属性并在测试中创建dto吗?

1 个答案:

答案 0 :(得分:3)

  

这是您可以做的事情吗?我收到一个错误消息:“属性参数必须是一个常量表达式...”我想我看到某个地方属性只能将原始类型作为参数?

该信息正确。无需进一步的解释。

  

这是错误的方法吗?我应该只传递属性并在测试中创建dto吗?

您可以使用基本类型并在测试中创建模型。

[TestMethod]
[DataRow("Leo", 22)]
[DataRow("John", null)]
public void AddStudent_WithMissingFields_ShouldThrowException(string firstName, int? age,) {
    StudentDto studentDto = new StudentDto { 
        FirstName = firstName, 
        Age = age.GetValueOrDefault(0) 
    };
    // logic to call service and do an assertion
}

或按照注释中的建议,使用[DynamicData]属性

static IEnumerable<object[]> StudentsData {
    get {
        return [] {
            new object[] {
                new StudentDto { FirstName = "Leo", Age = 22 },
                new StudentDto { FirstName = "John" }
            }
        }
    }
}

[TestMethod]
[DynamicData(nameof(StudentsData))]
public void AddStudent_WithMissingFields_ShouldThrowException(StudentDto studentDto) {
    // logic to call service and do an assertion
}