我正在为MVC 5互联网应用程序编写一些单元测试。
我是否应该在Assert
代码行中对预期值进行硬编码,或者在输入值发生变化之前从输入值中计算出该值。
以下是一个例子:
我有一个函数可以从Account
对象中Account
对象subscriptionCostPerDay
和accountBalance
减去正确的余额。
以下是代码:
account1.subscriptionCostPerDay = 0.99M;
account1.accountBalance = 10;
我正在测试的功能会计算subscriptionCostPerDay
并从accountBalance
中减去此值。在上面的示例中,函数调用后accountBalance
应为9.01。
Assert
语句是否应该硬编码9.01的值,还是应该从原始对象值计算预期值?
以下是我在上面提到的两种不同类型的例子:
1
Assert.AreEqual(9.01M, account1Balance, "Account 1 has correct account balance");
2
decimal expectedAccount1Balance = account1.accountBalance - account1.subscriptionCostPerDay;
Assert.AreEqual(expectedAccount1Balance, account1Balance, "Account 1 has correct account balance");
提前致谢。
答案 0 :(得分:12)
单元测试有两个目标:
为达到目标(1),您的测试就像是第二个人的校对。您可以在代码中写出测试结果独立的预期结果。
因此,account1Balance
不非常重要,因为您在代码中使用了相同的公式。确切地说,这个公式可能是错误的,编写测试是一种查找方法。
答案 1 :(得分:3)
经验法则:“预期值不应包含任何逻辑”。
关于那个
有一个很好的Roy Osherove's blog post "Two different ways to create bad logic in unit tests"