📜  如何在nunit c#中将对象作为测试用例传递(1)

📅  最后修改于: 2023-12-03 15:08:55.877000             🧑  作者: Mango

如何在NUnit C#中将对象作为测试用例传递

在NUnit中,我们可以使用TestCaseSource属性指定一个数据源来指定我们的测试用例。常见的数据源可以是一个数组、列表、文件或数据库。然而,当我们需要将对象作为测试用例传递时,我们需要将它们包装在对象数组中,这可能会导致代码显得非常凌乱。

在本文中,我们将讨论如何使用C#的匿名类型和反射来避免使用对象数组,并使测试用例看起来更加整洁。

第一步 - 创建匿名类型

首先,我们需要创建一个匿名类型,该类型将表示我们的测试用例对象。假设我们有一个名为Person的类,其中包含名字和年龄两个属性。

var person = new { Name = "John", Age = 30 };

我们可以使用上面的代码创建一个匿名类型对象,该对象将具有Name和Age两个属性,并且它们的值分别为"John"和30。

第二步 - 反射

下一步,我们需要使用反射来检索对象的属性并将它们设置为要传递给测试用例的参数。我们可以创建一个辅助方法来做到这一点。

private static TestCaseData CreateTestCase(object obj)
{
    var data = new TestCaseData(obj);

    foreach (var prop in obj.GetType().GetProperties())
    {
        data.SetArgumentValue(prop.Name, prop.GetValue(obj));
    }

    return data;
}

上面的方法将接受一个对象作为参数,并使用反射检索其所有属性。然后,它将使用SetArgumentValue方法将属性的值设置为测试用例的参数。

第三步 - 创建测试用例源

现在我们有了一个辅助方法,我们可以在TestCaseSource属性中使用它来创建我们的测试用例源。

private static IEnumerable<object> TestCases()
{
    yield return CreateTestCase(new { Name = "John", Age = 30 });
    yield return CreateTestCase(new { Name = "Jane", Age = 25 });
    yield return CreateTestCase(new { Name = "Bob", Age = 40 });
}

[Test, TestCaseSource(nameof(TestCases))]
public void TestPerson(Person person)
{
    // test logic here
}

上面的代码包括一个名为TestCases的静态方法,该方法将返回一个IEnumerable类型,其中包含我们要测试的多个对象。这些对象将作为参数传递给CreateTestCase方法,并将返回的TestCaseData对象作为元素添加到IEnumerable中。

最后,我们将使用TestCaseSource属性引用TestCases方法,并将测试用例方法的参数设置为我们要传递的对象类型(在本例中为Person)。

结论

在本文中,我们使用了C#的匿名类型和反射来避免在NUnit中使用对象数组,并使测试用例看起来更加整洁。我们创建了一个辅助方法来检索对象的属性并将它们设置为测试用例的参数。然后,我们将使用TestCaseSource属性引用TestCases方法,该方法将返回多个TestCaseData对象,其中每个对象都包含要传递给测试用例的参数。

使用这种方法,我们可以轻松地传递对象作为测试用例,并避免使用冗长的数组。