【问题标题】:NUnit - Testing that a Method was CalledNUnit - 测试方法是否被调用
【发布时间】:2018-01-03 07:14:08
【问题描述】:

如何测试以下代码?

public void CreateRentalIfNecessary(int? rentalId)
{
  if (rentalId.HasValue) { CreateRental(rentalId.Value); }
}

我需要编写一个简单的单元测试来验证CreateRental 是否在rentalId 不是null 时被调用。我该如何测试?

那么这里的答案似乎太复杂了:how to assert if a method has been called using nunit

【问题讨论】:

  • 通常,您会通过检查 CreateRental 是否做了它应该做的事情来测试该方法是否被调用,例如,向您的数据库或模拟数据库添加一个新的租用。
  • 单元测试很难。我会说你引用的文章是正确的。单独使用 nUnit 没有内置机制来执行此操作。您需要结合使用某种模拟框架来编写代码并考虑测试,即遵循 SOLID 原则。
  • 我想到了几个想法。如果 CreateRental 引用了通过依赖注入插入的某个对象,您可以使用 Moq 实例化该对象并使用 Moq 的验证方法来验证该方法是否被调用。或者使用 Unity Interception 来实现方法进入/退出跟踪并以这种方式断言它。或者通过读取日志文件实现方法进入/退出记录和验证。希望这会有所帮助。
  • @MitchStewart 创建租用与被测方法在同一服务类中。我们正在使用起订量,所以我可以使用。
  • 如果您希望我们能够为您提供帮助,您需要出示CreateRental() 的代码。

标签: c# nunit


【解决方案1】:

以表面上的例子为例,您试图同时测试同一对象的两个方法,CreateRentalIfNecessaryCreateRental。由于它们都在同一个对象中,因此您不能使用模拟。这让我得出了几个不同的结论......

  1. 其中一种方法可能不需要。您真的要在不需要必要时创建方法吗?也许您可以删除 ...IfNecessary 变体并始终检查CreateRental 中的必要性。当然,这是否可行取决于方法被调用的方式。

  2. 作为一种变体,只需让客户端进行测试以查看是否需要调用。

  3. 如果两者都真的需要,我想你正在测试CreateRental。在这种情况下,您应该能够为 CreateRentalIfNeeded 重用相同的测试用例。

我的偏好是选择 (1) 之类的东西。您的测试可能会告诉您重构 SUT。

【讨论】:

  • 我在 API 控制器方法中有 if 语句。我们的架构师让我测试整个控制器,看看是否调用了CreateRental——对我来说似乎很愚蠢,所以我试图将它移到单独的测试方法中。现在我陷入了这个困境。无论如何,所有选项都可以!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多