C# 用单元测试复合方法c覆盖#

C# 用单元测试复合方法c覆盖#,c#,unit-testing,C#,Unit Testing,什么是最好的测试方法 public void HandleRequests() { var requests = _requestService.GetAll(); foreach(var request in requests) { if (request.IsDelete) { _dateCheckerService.CheckRequest(request); _notification

什么是最好的测试方法

public void HandleRequests()
{
    var requests = _requestService.GetAll();
    foreach(var request in requests)
    {
        if (request.IsDelete)
        {
            _dateCheckerService.CheckRequest(request);
            _notificationService.Send(request);
            _invoiceService.CreateInvoice(request);
        }
    }
}

测试if块的最佳方法是什么。我想验证所有3种方法是否都被调用不是一个好主意假定您使用模拟数据正确地注入服务,一个有效的测试(在我看来)是检查日期、通知和发票服务,如果它们已经完成了删除请求的工作

但是,我想指出,您正在测试的方法有两个方面:

  • 获取请求
  • 处理请求
  • 因此,它的名称应该是
    getAndHandlerRequests
    ,我认为这不是一件好事,您可能希望更改方法签名以将请求作为参数并处理它们。

    要测试此方法(特别是if块),假设您正在注入依赖项(例如_requestService)这些依赖项是可以被mock替换的抽象,那么为了测试这个方法,您需要断言您的各种依赖项方法收到了预期的请求对象,例如_dateCheckerService.CheckRequest(request)

    要实现这一点,您可以编写自己的模拟或使用模拟库,如或

    测试此方法的问题是,您必须进行大量设置(创建四个模拟,构建请求集合…),最终结果将非常脆弱。例如,假设您决定重构并且不再需要依赖项之一,结果将是相同的,但您的测试将中断,因为您不仅测试方法的功能,而且测试方法的执行方式,您的测试将取决于您的实现

    <>单元测试你的代码是一个很好的计划,但是在这种情况下,我会考虑你所创建的测试的复杂性和脆性是否值得单元测试带来的好处,但是只有你能回答。 如果继续测试,我建议对If块进行多个测试,每个依赖项一个测试,每个测试应该只有一个断言

    测试If块

  • 创建两个请求,一个为IsDelete=true,另一个为IsDelete=false。设置测试,以便_requestService.GetAll()将返回这两个请求
  • 断言_dateCheckerService.CheckRequest()传递的是IsDelete请求,而不是IsDelete=false请求
  • 对_notificationService.Send()和_invoiceService.CreateInvoice()重复步骤二
    您测试的每个依赖项都应该在其自己的测试中进行测试。

    您的意思是只需验证在执行时调用了所有三个方法就可以了?这就是我测试它的方式。我需要创建三个测试来正确检查if语句,对吗?@xczxc要完全测试这一点,您需要声明_-datcherservice.CheckRequest(),_notificationService.Send()和_invoiceService.CreateInvoice()都传递了一个请求对象,请求对象为delete。您还可以测试它们是否不接收不是IsDelete的请求。您可以通过一个大型测试或几个较小的测试(我推荐)来完成,但如果我将其测试为较小的部分,例如,在本例中,我尝试检查_datCheckerService.CheckRequest(),但在本例中,将调用所有其他服务,可以吗?我应该集中精力检查datechacker.CheckRequest,跳过其他结果?@xczxc是的,没关系。如果您的测试检查了所有内容,那么当它失败时,您就很难确定失败的原因。但是,如果您有三个测试,但每个测试中只检查一个依赖项,那么当其中一个测试失败时,您就会立即知道原因。在每次测试中调用这三个函数并不影响测试结果