C# NUnit-测试是否调用了方法

C# NUnit-测试是否调用了方法,c#,nunit,C#,Nunit,如何测试以下代码 public void CreateRentalIfNecessary(int? rentalId) { if (rentalId.HasValue) { CreateRental(rentalId.Value); } } 我需要编写一个简单的单元测试来验证当rentalId不是null时是否调用了createrent。我如何测试这个 然后这里的答案似乎太复杂了:从表面上看,您试图同时测试同一对象的两种方法,CreateRental和CreateRental。因为它们都在

如何测试以下代码

public void CreateRentalIfNecessary(int? rentalId)
{
  if (rentalId.HasValue) { CreateRental(rentalId.Value); }
}
我需要编写一个简单的单元测试来验证当
rentalId
不是
null
时是否调用了
createrent
。我如何测试这个


然后这里的答案似乎太复杂了:

从表面上看,您试图同时测试同一对象的两种方法,
CreateRental
CreateRental
。因为它们都在同一个对象中,所以不能使用模拟。这让我得出了几个不同的结论

  • 其中一种方法可能是不需要的。你真的想在没有必要时创建一个方法吗?也许您可以删除…if required变量,并始终在
    CreateRental
    中检查是否需要。当然,这是否可能取决于调用方法的方式

  • 作为一种变体,只需让客户端进行测试,看看是否需要调用

  • 如果两者都是真正需要的,那么我认为您正在测试
    CreateRental
    。在这种情况下,您应该能够为
    CreateRentalIfNeeded
    重用相同的测试用例


  • 我更喜欢(1)这样的东西。您的测试可能会告诉您重构SUT。

    通常,您会通过检查
    createRent
    是否执行了它应该执行的操作来测试该方法是否被调用,例如,向数据库或模拟数据库添加新的租用。单元测试很困难。我得说你提到的那篇文章很贴切。单凭nUnit是无法做到这一点的。您需要使用某种模拟框架,并在编写代码时考虑测试,即遵循坚实的原则。如果CreateRent引用通过依赖项注入插入的某个对象,则可以使用Moq实例化该对象,并使用Moq的Verify方法验证该方法是否被调用。或者使用Unity拦截来实现方法进入/退出跟踪,并以这种方式断言它。或者通过读取日志文件实现方法进入/退出日志记录和验证。希望这有帮助。@MitchStewart Create rental与测试中的方法在同一服务类中。我们正在使用Moq,所以我可以使用。如果希望我们能够帮助您,您需要显示
    CreateRental()
    的代码。我在API控制器方法中有if语句。我们的架构师让我测试整个控制器,看看是否调用了
    CreateRental
    ——这对我来说似乎很愚蠢,所以我尝试将其转移到单独的方法中进行测试。现在我陷入了两难境地。不管怎么说,所有的选择都是免费的!