Ping / PingReply的单元测试 - 模拟?

时间:2012-04-11 23:00:10

标签: c# visual-studio unit-testing mstest rhino-mocks

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

我在您的示例中看到的唯一难点是new Ping()来电。在某些时候,您可能希望验证是否使用正确的数据调用了Send,此时这几乎是不可能的。对象的创建通常是用Factory method pattern抽象的,所以如果你确实遇到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);
}