3

我希望找到一种方法来对我的 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 并为此添加另一个构造函数和一堆工作之外,有没有办法轻松地对其进行单元测试,或者我不应该浪费我的时间?

4

2 回答 2

2

我在您的示例中看到的唯一困难是new Ping()通话。在某些时候,您可能想要验证是否Send使用正确的数据调用,目前这几乎是不可能的。对象的创建通常使用工厂方法模式进行抽象,因此如果您确实遇到了问题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);
}
于 2012-04-12T07:16:07.457 回答
2

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

查看像Ninject这样的 IOC 容器可以让您的生活更轻松,尤其是在您连接大量依赖项的情况下。

至于你是否应该,我对“我应该让这段代码可测试并为它编写测试”的回答总是响亮的YES

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

于 2012-04-12T02:07:00.110 回答