如何模拟没有默认构造函数的类

时间:2019-02-06 14:17:11

标签: c# nunit moq

我想模拟一个没有默认构造函数的类,并在其中调用一个方法。此方法调用同一类的另一个方法。我想设置第二种方法以返回一个值,然后执行第一种方法的其余部分以测试一些结果。

[a-z0-9._]

我嘲笑Foo,因为我不希望在测试func1()时执行func2()。因此,我将模拟对象设置为在func1()调用func2()时不执行该值就返回func2()的值。

运行此测试用例时,出现异常“ System.NotSupportedException:父级没有默认构造函数。必须明确定义默认构造函数。”

如果在调试测试用例时看到了模拟对象,则模拟对象.Object没有被初始化。 我是单元测试和Mock的新手。有人可以帮我解决我要去哪里。

2 个答案:

答案 0 :(得分:0)

太过回答您的问题了,您可以按照this thread:

的建议提供参数
var mockObject = new Mock<Foo>(MockBehaviour.Default, FooParameters);
mockObject.Setup(x=>x.func2(a,b,c)).Returns(d);
mockobject.Object.func1();

但是,这并不是一个好主意。通常,您不应该模拟受测系统。这样做可能表明您的班级做得太多,需要重组,才能只做一件事情。

但是,在某些情况下,一个类可能具有多个相互依赖的API成员。想一想要测试多个重载的重载链。当然,编写最内部过载(具有最多参数)的测试很容易。但是,如果要测试您的其他重载是否为最内部的重载正确设置了参数,则确实会卡住。

void DoSomething()
{
    var param = ...
    DoSomething(param);
}
void DoSomething(int p)
{
    // the most inner overload
}

没有通用的规则来解决这种依赖性。在这种情况下,我倾向于将测试中的系统子类化,并用空主体覆盖其(virtual)成员-这也是MOQ内部所做的。

答案 1 :(得分:0)

您实际问题的答案:

  

如何模拟没有默认构造函数的类

您需要使用不同的Mock ctor重载,以便将参数传递给非默认的Foo ctor:

  var mockObject = new Mock<Foo>(1, 2);

但是,您的测试策略存在缺陷,我认为这是由于您了解Moq的功能所致。

模拟对于平息所测试对象的复杂依赖性很有用-无需实例化,处理其生命周期,而是对其进行模拟。当它们不影响您正在测试的代码时(这是其他人在此问题中提到的),这没关系-这不是您的意图。由于Func2()与func1()的实现紧密结合,即现在编写代码的方式,因此无法在不执行Func2()的情况下执行Func1()。

您可以更改Func1()的函数签名以将Func2()作为参数-这将允许您修改在测试过程中传递给它的函数(并使您可以轻松模拟Func2()的行为) 。但是您已经说过这是不可能的。

相关问题