我在NUnit 2.6.1上使用TestCaseSource来测试具有不同对象类构造函数参数的相同Assert。
我的意思是,
[Test, TestCaseSource("myConstructorsForMale")}
public void CheckMale(Person p)
{
Assert.That(p.IsMale);
}
static Person[] myConstructorsForMale =
{
new Person("John"),
new Person(isMale=true),
new Person("Doe")
};
好的,一切运行正常,但这是我在NUnit控制台上收到的结果:
- CheckMale
- CheckMale(人)
- CheckMale(人)
- CheckMale(人)
所以我不知道每次迭代执行的测试是什么,如果其中任何一个失败,我就无法得到失败的测试。
我的问题是: 有没有办法用注释或类似的东西来识别传递给测试的参数是什么? (在TestCaseSource属性方式中)
感谢。
答案 0 :(得分:11)
如果使用“本机”NUnitor ReSharper作为测试运行器,您可以覆盖ToString
方法,以便您拥有良好的人员定义。
例如,您的测试代码可能如下所示:
public class PersonTests
{
[Test, TestCaseSource("myConstructorsForMale")]
public void CheckMale(Person p)
{
Assert.That(p.IsMale);
}
static Person[] myConstructorsForMale =
{
new Person("John"),
new Person{IsMale=true},
new Person("Doe")
};
}
人类可以是:
public class Person
{
public Person(string name)
{
this.Name = name;
}
public Person() { }
public string Name { get; set; }
public bool IsMale { get; set; }
public override string ToString()
{
return string.Format("Name:{0};IsMale:{1}", Name, IsMale);
}
}
结果窗口如下所示:
我也在你可能使用的原生NUnit测试运行器上检查过它。它还可以很好地显示人物:
答案 1 :(得分:2)
重复Ilya Ivanov的回答,如果你不想修改被测试的课程只是为了测试它,你可以将"放到字符串"测试夹具中的逻辑。
向灯具添加方法,如:
IEnumerable<TestCaseData> PersonTestCases()
{
myConstructorsForMale.Select(
p => new TestCaseData(p).SetName(string.Format("Name:{0};IsMale:{1}" ,p.Name, p.IsMale));
);
}
这会为TestCaseData
列表中的每个人创建一个myConstructorsForMale
实例。诀窍在于它设置Name
实例的TestCaseData
属性,以告诉测试运行器要显示的内容。
某些测试跑步者可能会更好地使用SetDescription
而不是SetName
。
然后将您的TestCaseSource
属性修改为:
[Test, TestCaseSource("PersonTestCases")]
这应该会产生类似的结果:
- CheckMale
- 姓名:; IsMale:True
- 名称:Doe的; IsMale:假
- 姓名:John; IsMale:假