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

时间:2018-05-10 07:10:43

标签: c# unit-testing

测试方法的最佳方法是什么

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个方法都被称为

并不是一个好主意

2 个答案:

答案 0 :(得分:0)

假设您正在使用模拟数据正确地注入服务,那么有效的测试(在我看来)是检查日期,通知和发票服务,如果他们在删除请求上完成了他们的工作。

但是,我想指出你正在测试的方法是做两件事:

  1. 获取请求
  2. 处理请求
  3. 所以它的名称是GetAndHandleRequests,我认为这不是一件好事,你可能想要更改方法签名以将请求作为参数并处理它们。

答案 1 :(得分:0)

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

要完成此操作,您可以编写自己的模拟或使用模拟库,例如MoqNSubstitute

测试此方法的问题在于,您将不得不进行大量设置(创建四个模拟,构建您的请求集合......),最终结果将变得非常脆弱。例如,假设您决定重构并且不再需要其中一个依赖项,结果将是相同的但是您的测试将会中断,因为您不仅测试该方法的作用,而且测试它是如何进行的,您的测试将取决于关于你的实施。

对您的代码进行单元测试是一个很好的计划,但在这种情况下,我会考虑您创建的测试的复杂性和脆弱性是否值得单元测试带来的好处,但只有您可以回答这个问题。

如果继续进行测试,我建议对if块进行多次测试,每次测试一次,每次测试应该只有一个断言。

测试If块;

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