C# 嘲笑';新的();最小起订量约束

C# 嘲笑';新的();最小起订量约束,c#,.net,unit-testing,moq,C#,.net,Unit Testing,Moq,我想用类型签名测试一个函数 public static void DoSomething<T>(T something) where T : class, IInterfaceA, IInterfaceB, new() publicstaticvoiddosomething(T something) 其中T:class,IInterfaceA,IInterfaceB,new() 它在内部使用new T() 我在为T创建模拟时遇到问题。多亏了另一个问题,我已经找到了解决问题

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

public static void DoSomething<T>(T something)
    where T : class, IInterfaceA, IInterfaceB, new()
publicstaticvoiddosomething(T something)
其中T:class,IInterfaceA,IInterfaceB,new()
它在内部使用
new T()

我在为
T
创建模拟时遇到问题。多亏了另一个问题,我已经找到了解决问题的方法。但是,我无法创建满足
new()
约束的模拟。如何使用最小起订量解决此问题?

您有两种选择:

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

  • 两者之间的选择取决于分割逻辑的难度,以及剩余代码是否有足够的“肉”在它里面,如果你愿意为一个可以伪造新的模拟框架付费,你不需要IMO-你可以创建一个虚拟类并在那里内部使用Moq-看看一旦你使用了新的,你就失去了与伪造的连接-顺便说一句:如果你使用
    new
    而不是
    new()
    constraint,您应该在
    DoSomething()
    中添加一个
    Func create
    参数,并调用该参数来创建对象,而不是
    新建它。确切地说,如何创建对象不是
    DoSomething()
    应该知道的事情。
    DoSomething
    是一种静态方法,因此您不能使用
    moq
    来伪造它。。。您模拟
    new()
    约束的努力毫无价值……@OldFox他试图测试它,而不是模拟它。这似乎是模拟比测试代码复杂得多的实例之一。。。我建议重新考虑设计……你是对的。本质上,我正在滥用
    new()
    约束来避免更显式的解决方案——传递构造函数。