猿问

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

什么是最好的测试方法


public void HandleRequests()

{

    var requests = _requestService.GetAll();

    foreach(var request in requests)

    {

        if (request.IsDelete)

        {

            _dateCheckerService.CheckRequest(request);

            _notificationService.Send(request);

            _invoiceService.CreateInvoice(request);

        }

    }

}

测试是否阻塞的最佳方法是什么?我想验证所有 3 个方法都被调用不是一个好主意


神不在的星期二
浏览 136回答 2
2回答

慕慕森

要测试此方法(特别是 if 块),假设您正在注入依赖项(例如 _requestService),并且这些依赖项是可以被模拟替换的抽象,然后要测试此方法,您需要断言您的各种依赖项方法收到了预期请求对象,例如_dateCheckerService.CheckRequest(request)。为此,您可以编写自己的模拟或使用模拟库,例如Moq或NSubstitute。测试此方法的问题在于您必须进行大量设置(创建四个模拟,构建您的请求集合......),最终结果将非常脆弱。例如,假设您决定重构并且不再需要您的依赖项之一,结果将是相同的,但您的测试将中断,因为您不仅要测试该方法的功能,还测试它是如何执行的,您的测试将取决于关于你的实施。对你的代码进行单元测试是一个很好的计划,但在这种情况下,我会考虑你将创建的测试的复杂性和脆弱性是否值得单元测试带来的好处,但只有你能回答这个问题。如果你继续测试,我建议对 if 块进行多个测试,每个依赖项一个,每个测试应该只有一个断言。测试 If 块;创建两个请求,一个是 IsDelete = true,另一个是 IsDelete = false。设置您的测试,以便 _requestService.GetAll() 将返回这两个请求。断言 _dateCheckerService.CheckRequest() 已传递 IsDelete 请求,但未传递 IsDelete = false 请求。对 _notificationService.Send() 和 _invoiceService.CreateInvoice() 重复第二步;您测试的每个依赖项都应在其自己的测试中进行测试。
随时随地看视频慕课网APP
我要回答