您可以编写参数化测试并将属性访问器作为参数传递:
请参阅示例:假设您的具有 3 个属性的类是:
public class MyClass
{
public string First { get; set; }
public string Second { get; set; }
public string Third { get; set; }
}
然后测试可能看起来:
[TestFixture]
public class MyTest
{
private TestCaseData[] propertyCases = new[]
{
new TestCaseData(
"First",
(Func<MyClass, string>) (obj => obj.First),
(Action<MyClass, string>) ((obj, newVal) => obj.First = newVal)),
new TestCaseData(
"Second",
(Func<MyClass, string>) (obj => obj.Second),
(Action<MyClass, string>) ((obj, newVal) => obj.Second = newVal)),
new TestCaseData(
"Third",
(Func<MyClass, string>) (obj => obj.Third),
(Action<MyClass, string>) ((obj, newVal) => obj.Third = newVal))
};
[Test]
[TestCaseSource("propertyCases")]
public void Test(string description, Func<MyClass, string> getter, Action<MyClass, string> setter)
{
var obj = new MyClass();
setter(obj, "42");
var actual = getter(obj);
Assert.That(actual, Is.EqualTo("42"));
}
}
几点注意事项:
1. 未使用的字符串描述作为第一个参数传递,以区分通过 NUnit 测试运行器 UI 或 Resharper 运行的测试用例。
2. Tet 案例是独立的,即使First
属性测试失败,其他 2 个测试也会运行。
3. 可以通过 NUnit 测试运行器 UI 或通过 Resharper 单独运行一个测试用例。
所以,你的测试是干净和干燥的 :)