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