5

我正在为 MVC 5 互联网应用程序编写一些单元测试。

我应该在代码行中对预期值进行硬编码Assert,还是在输入值更改之前从输入值计算该值。

这是一个例子:

我有一个函数可以从对象具有 a和a 的Account对象中减去正确的余额。AccountsubscriptionCostPerDayaccountBalance

这是代码:

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");

提前致谢。

4

2 回答 2

18

单元测试有两个目标:

  1. 当测试第一次不起作用时,在您的代码中查找错误
  2. 确保您的代码在未来一段时间内保持正确

为了实现目标 (1),您的测试就像由第二个人进行校对。您编写测试的预期结果,与您在代码中得出此结果的方式无关

因此它非常重要,它account1Balance不是通过您在代码中使用的相同公式计算的。确切地说,这个公式可能有问题,编写测试是找出答案的一种方法。

于 2015-02-02T07:23:06.110 回答
7

经验法则:“预期值不应包含任何逻辑”。

  1. 如果代码中存在错误,并且我们使用相同的逻辑来计算测试中的预期值,那么我们就是在复制错误。
  2. 计算期望值的逻辑可能有缺陷,因此我们最终会在测试代码中出现错误。
  3. 考虑到可读性,更容易理解硬编码的值。

有一篇很好的 Roy Osherove 的博客文章“在单元测试中创建错误逻辑的两种不同方法”

于 2015-02-02T19:11:56.450 回答