使用Moq测试对其他班级的通话

时间:2019-02-06 08:50:04

标签: c# unit-testing moq

问题

我有以下方法:

public void ParseRebootData(RebootDeviceDto rebootDeviceDto)
{
    if (rebootDeviceDto.RebootAtUtc.CompareTo(DateTime.UtcNow) <= 0) // if time is either now or in the past, reboot instantly
    {
        Console.WriteLine("Rebooting machine now");
        await new Tasks.Reboot().RebootNow(); // <-- I want to test this line

    }
    else // schedule the reboot
    {
        Console.WriteLine($"Scheduling reboot at {rebootDeviceDto.RebootAtUtc}");
        _backgroundJobClient.Schedule<Tasks.Reboot>(x => x.RebootNow(), rebootDeviceDto.RebootAtUtc);
    }
}

_backgroundJobClient通过构造函数中的依赖项注入传递。

我想使用Moq的await new Tasks.Reboot().RebootNow();方法测试行Verify是否被调用。

我的问题

由于Tasks.Reboot只是一个类,没有通过依赖项注入传递,所以我不知道是否可以测试此调用。

解决方案之一可能是创建一个TasksService,可以在单元测试中覆盖它(这可能不是一个坏主意),但我想知道这是否完全可以实现。 / p>

1 个答案:

答案 0 :(得分:4)

使用Moq,您只能从外部提供模拟对象。您不能将静态实例替换为另一个实例。

还有其他测试框架可以做到这一点,例如Microsoft Fakes的填充。另一方面,垫片应与第三方代码一起使用。如果您可以更改代码并注入TasksService,则这是分离代码的首选方法。