【问题标题】:Unit tests code with Dns.GetHostEntry(hostNameOrIp) dependency具有 Dns.GetHostEntry(hostNameOrIp) 依赖项的单元测试代码
【发布时间】:2014-07-01 03:07:43
【问题描述】:

我有使用 Dns.GetHostEntry(hostNameOrIp) 的代码,我想检查一下场景,有一次这个函数返回实际值但是在某个时间(当我决定时)这个函数抛出异常。
目前我在 Visual Studio 2010 中使用 MSTest 框架。 有人知道实现它的最简单方法是什么?

【问题讨论】:

  • 你使用哪个测试加倍框架?到目前为止,您尝试过什么?
  • 我没有使用当前的模拟框架,因为我读到用非虚拟方法模拟静态类有问题...

标签: c# unit-testing dependencies


【解决方案1】:

实现它的最简单方法是为此静态方法创建包装器:

public class DnsWrapper : IDnsWrapper
{
    public IPHostEntry GetHostEntry(string hostNameOrAddress)
    {
         Dns.GetHostEntry(hostNameOrAddress);
    }
}

并使你的代码依赖于这个接口:

public interface IDnsWrapper
{
   IPHostEntry GetHostEntry(string hostNameOrAddress);
}

现在使用任何模拟库都可以很容易地模拟这种依赖关系。例如Moq:

Mock<IDnsWrapper> dnsMock = new Mock<IDnsWrapper>();
dnsMock.Setup(d => d.GetHostEntry(It.IsAny<string>()))
       .Throws(new SocketException());

var yourClass = new YourClass(dnsMock.Object); // inject interface implementation
yourClass.DoSomethingWhichGetHostsEntry();

【讨论】:

  • 我不熟悉moq框架我可以在单元测试中更改函数行为吗?一次它不会抛出异常,一次它会抛出异常?
  • @ilayzeidman 你绝对可以做到。不过,我会注意在单元测试过程中改变像这样的模拟对象的行为。相反,您将有多个单元测试(例如,一个用于模拟对象抛出异常时,一个用于当它不抛出异常时)。
  • @ilayzeidman 如果方法调用的参数不同,那么它很容易 - 只需添加两个接受不同参数的设置,例如Setup(d =&gt; d.GetHostEntry("foo")).Returns(...)Setup(d =&gt; d.GetHostEntry("bar")).Throws(...)。但正如 Lilshieste 指出的那样,考虑为此创建两个不同的测试
  • 在我的场景中,它与 DNS 成功解析的参数(computerName)相同,并且在它无法解析相同的计算机名之后(这是我想要在开发中检查的真实场景和当一些用户说有错误时,不在生产中:)
  • @ilayzeidman 其非常奇怪的要求,正如我已经指出的,但也可以做到——您可以使用模拟的Callback 手动提供返回结果
猜你喜欢
  • 2010-09-12
  • 2011-12-20
  • 2011-10-31
  • 1970-01-01
  • 2011-06-03
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
相关资源
最近更新 更多