你可以编写带有参数的测试,并将属性访问器作为参数传递:
看一个例子:
假设你的类有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. 测试用例是独立的,即使
First
属性的测试失败,其他两个测试也将被运行。
3. 可以通过NUnit测试运行器UI或通过Resharper仅运行一个测试用例。
所以,您的测试是干净且DRY的 :)