【问题标题】:Mocking the 'new()' constraint with Moq用 Moq 模拟 'new()' 约束
【发布时间】:2015-09-16 08:16:25
【问题描述】:

我想用类型签名测试一个函数

public static void DoSomething<T>(T something)
    where T : class, IInterfaceA, IInterfaceB, new()

在内部使用new T()

我在为 T 创建模拟时遇到问题。感谢另一个问题,我已经找到了mocking multiple interfaces 的解决方案。但是,我无法创建满足 new() 约束的模拟。如何使用 Moq 解决这个问题?

【问题讨论】:

  • 你没有 IMO - 你可以创建一个 Dummy 类并在内部使用 Moq - 一旦你使用 new 你就会失去与假货的联系 - 顺便说一句:这似乎有点如果你在那里使用new 会有一股气味
  • 不要使用new() 约束,您应该将Func&lt;T&gt; create 参数添加到DoSomething() 并调用它来创建对象,而不是使用new 来创建对象。究竟如何创建对象不是DoSomething()应该知道的。
  • DoSomething 是一种静态方法,因此您将无法使用moq 伪造它...您模拟new() 约束的努力毫无价值....
  • @OldFox 他试图测试它,而不是模拟它。
  • 这似乎是 mock 比测试代码复杂得多的实例之一......我建议重新考虑设计......

标签: c# .net unit-testing moq


【解决方案1】:

你有两个选择:

  1. 使用无约束的模拟框架。在 .NET 中,它表示 Isolator 或 JustMock。两者都使用 IL weaving 在运行时注入代码,并且可以伪造/模拟在生产代码中创建的对象。
  2. 拆分DoSomething逻辑并使用依赖注入而不是创建对象作为逻辑的一部分。

在两者之间进行选择取决于拆分逻辑的难度、剩余代码中是否有足够的“肉”以及您是否愿意为可以伪造的 Mocking 框架付费 new em>

【讨论】:

  • 你是对的。本质上,我滥用new() 约束来避免更明确的解决方案——传递构造函数。
猜你喜欢
  • 2016-06-06
  • 2011-11-23
  • 2011-06-13
  • 2019-09-11
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多