单元测试中的预期值

时间:2015-02-02 06:55:34

标签: c# assert unit-testing object-expected

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

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

以下是一个例子:

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

以下是代码:

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

提前致谢。

2 个答案:

答案 0 :(得分:12)

单元测试有两个目标:

  1. 当测试第一次不起作用时,在代码中查找错误
  2. 确保您的代码在未来的时间内保持正确
  3. 为达到目标(1),您的测试就像是第二个人的校对。您可以在代码中写出测试结果独立的预期结果。

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

答案 1 :(得分:3)

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

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

    有一个很好的Roy Osherove's blog post "Two different ways to create bad logic in unit tests"