C# 单元测试中的期望值

C# 单元测试中的期望值,c#,assert,unit-testing,object-expected,C#,Assert,Unit Testing,Object Expected,我正在为MVC5互联网应用程序编写一些单元测试 我应该在Assert代码行中硬编码期望值,还是在输入值发生变化之前根据输入值计算该值 以下是一个例子: 我有一个函数,可以从帐户对象中减去正确的余额,其中帐户对象具有subscriptionCosterDay和帐户余额 代码如下: account1.subscriptionCostPerDay = 0.99M; account1.accountBalance = 10; 我正在测试的函数计算subscriptionCostPerDay并从账户余额

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

我应该在
Assert
代码行中硬编码期望值,还是在输入值发生变化之前根据输入值计算该值

以下是一个例子:

我有一个函数,可以从
帐户
对象中减去正确的余额,其中
帐户
对象具有
subscriptionCosterDay
帐户余额

代码如下:

account1.subscriptionCostPerDay = 0.99M;
account1.accountBalance = 10;
我正在测试的函数计算
subscriptionCostPerDay
并从
账户余额中减去它。在上面的示例中,函数调用后,
accountBalance
应为9.01

Assert
语句应该硬编码9.01的值,还是应该根据原始对象值计算期望值

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

一,

二,


提前感谢。

单元测试有两个目标:

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

    因此,非常重要的一点是,
    account1Balance
    不是由代码中使用的相同公式计算的。确切地说,这个公式可能有缺陷,编写测试是找到答案的一种方法。

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

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

  • 这有一个好处

    我更喜欢第一种方法。但是,这类问题在SO中是不允许的,它是一个编程问题。请解释为什么不允许。肯定是第一种方法。从单元测试的艺术中学习。类似的问题
    Assert.AreEqual(9.01M, account1Balance, "Account 1 has correct account balance");
    
    decimal expectedAccount1Balance = account1.accountBalance - account1.subscriptionCostPerDay;
    
    Assert.AreEqual(expectedAccount1Balance, account1Balance, "Account 1 has correct account balance");