Ping / PingReply - Mocking的单元测试

本文关键字:单元测试 Mocking PingReply Ping | 更新日期: 2023-09-27 18:30:44

我希望找到一种方法来对我的ping功能进行单元测试,或者能够用RhinoMocks模拟它

下面是我希望能够进行单元测试的代码的简单示例:

public PingReply PingMachine(string machineName)
{
    Ping ping = new Ping();
    return ping.Send(machineName);
}
public bool IsOnline(string machineName)
{
    var reply = PingMachine(machineName);
    if (reply.Status == IPStatus.Success)
    {
        return true;
    }
    return false;
}

除了创建我自己的 IPing 接口并将 Ping 变成 IPing 并为此添加另一个构造函数和一堆工作之外,有没有办法轻松地对此进行单元测试,或者我不应该浪费时间?

Ping / PingReply - Mocking的单元测试

听起来你已经知道一个使你的代码可测试的好方法:依赖抽象。不要使用Ping,使用IPing,并通过构造函数将IPing提供给将要使用它的类。

看看像 Ninject 这样的 IOC 容器,让你的生活更轻松,特别是如果你连接了很多依赖项。

至于你是否应该,我对"我应该让这段代码可测试并为它编写测试"的回答总是一个响亮的肯定

可以这样想:你有这个方法,IsOnline(string machineName) .假设您正在其他地方编写代码,并且想要测试该代码。但是该代码使用IsOnline!突然间,测试它变得更加困难。如果你可以模拟你的ping提供类,测试它将是轻而易举的。

我在您的示例中可以看到的唯一困难是new Ping()调用。在某些时候,您可能希望验证是否使用正确的数据调用了Send,目前这几乎是不可能的。对象的创建通常使用 Factory 方法模式进行抽象,因此如果您确实遇到new Ping()问题,我建议将 ping 创建委托给此类工厂并将其注入到您的测试类中。您的代码可能如下所示:

// some minor injection work
public TestedClass(IPingFactory pingsFactory)
{
    this.pingsFactory = pingsFactory;
}
public PingReply PingMachine(string machineName)
{
    IPing ping = pingsFactory.Create();
    return ping.Send(machineName);
}