单元测试中的预期值

use*_*648 5 c# unit-testing assert object-expected

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

我应该在Assert代码行中对预期值进行硬编码,还是在输入值发生变化之前从输入值中计算出该值.

这是一个例子:

我有一个函数从对象有a 和a 的Account对象中减去正确的平衡.AccountsubscriptionCostPerDayaccountBalance

这是代码:

account1.subscriptionCostPerDay = 0.99M;
account1.accountBalance = 10;
Run Code Online (Sandbox Code Playgroud)

我正在测试的函数计算subscriptionCostPerDay并从中减去它accountBalance.在上面的例子中,accountBalance函数调用后应该是9.01.

Assert语句应该硬编码9.01的值,还是应该从原始对象值计算预期值?

以下是我在上面提到的两种不同类型的示例:

1.

Assert.AreEqual(9.01M, account1Balance, "Account 1 has correct account balance");
Run Code Online (Sandbox Code Playgroud)

2.

decimal expectedAccount1Balance = account1.accountBalance - account1.subscriptionCostPerDay;

Assert.AreEqual(expectedAccount1Balance, account1Balance, "Account 1 has correct account balance");
Run Code Online (Sandbox Code Playgroud)

提前致谢.

DrK*_*och 12

单元测试有两个目标:

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

为了实现目标(1),您的测试就像是第二个人的校对.您可以独立于在代码中获得此结果的方式编写测试的预期结果.

因此,这是非常重要的,这account1Balance以相同的公式,你在你的代码中使用的计算.确切地说,这个公式可能是错误的,编写测试是一种查找方法.


bux*_*ter 6

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

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

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