每个用例编写一到二个断言是单元测试最佳实践的常见内容.那些这么认为的是极少和只展示一个单元测试的人。因此如果你采纳他们的建议,为一个很小的运算你都需要大量的单元测试去保证质量。这篇文章意图通过例子展示,一个测试用例多个断言是有必要和有价值的。
Person这个对象在数据绑定场景中经常出现,我们来看下。
测试FirstName
第一个来测试FirstName这个属性的设置,开始如下:
[TestMethod] public voidPerson_FirstName_Set() { varperson =newPerson("Adam","Smith"); person.FirstName ="Bob"; Assert.AreEqual("Bob", person.FirstName); } |
接下来我们来测试FirstName的改变通知。
[TestMethod] public voidPerson_FirstName_Set_PropertyChanged() { varperson =newPerson("Adam","Smith"); vareventAssert =newGranite.Testing.PropertyChangedEventAssert(person); person.FirstName ="Bob"; eventAssert.Expect("FirstName"); } |
当我们执行这个测试时,会得到一个失败提示信息“期望的属性名‘FirstName’,但接收到的是’IsChanged’”。显然,设置FirstName的属性触发了“IsChanged”标记,我们需要把它考虑在内。因此我们把它加入:
[TestMethod] public voidPerson_FirstName_Set_PropertyChanged() { varperson =newPerson("Adam","Smith"); vareventAssert =newGranite.Testing.PropertyChangedEventAssert(person); person.FirstName ="Bob"; eventAssert.SkipEvent();//this was IsChanged eventAssert.Expect("FirstName"); } |
鉴于以上两个测试,我们考虑当FirstName被修改时还有其他什么属性会改变。查看API,IsChanged和FullName属性会变化。
[TestMethod]
public voidPerson_FullName_Changed_By_Setting_FirstName() { varperson =newPerson("Adam","Smith"); person.FirstName ="Bob"; Assert.AreEqual("Bob Smith", person.FullName); } [TestMethod] public voidPerson_IsChanged_Changed_By_Setting_FirstName() { varperson =newPerson("Adam","Smith"); person.FirstName ="Bob"; Assert.IsTrue(person.IsChanged); } |