【发布时间】:2019-02-07 22:34:08
【问题描述】:
我想模拟一个没有默认构造函数的类并在其中调用一个方法。此方法调用同一类的另一个方法。我想设置第二种方法来返回一个值并执行第一种方法的其余部分来测试一些结果。
[Test]
public void TestFunction(){
int d=0;
var mockObject = new Mock<Foo>(){MockBehaviour.Default, p, q}; //p and q are parameters for Foo constructor
mockObject.Setup(x=>x.func2(a,b,c)).Returns(d);
mockobject.Object.func1();
}
Class Foo{
public Foo(int x,int y){}
public virtual int func1(){
DoSomething;
func2();
}
public virtual int func2(){}
}
我在嘲笑 Foo,因为我不想在测试 func1() 时执行 func2()。因此,我将 mockObject 设置为在 func1() 调用 func2() 时返回 func2() 的值而不执行它。
当我运行这个测试用例时,我得到异常“System.NotSupportedException : Parent 没有默认构造函数。必须显式定义默认构造函数。”
如果我在调试测试用例时看到 mockObject,mockObject.Object 没有被初始化。 我是单元测试和模拟的新手。有人可以帮我解决我哪里出错了。
【问题讨论】:
-
老实说,听起来你这里有点乱。为什么你的测试关心这个其他方法在做什么?如果它依赖于“其他东西”,那么应该注入该依赖项。这样,您可以非常简单地模拟依赖项。
-
@DavidG 似乎被测系统依赖于它的另一种方法,OP 已经测试过并且想要模拟。
-
通常你不应该模拟一个被测系统。但是,您可以继承
Foo并覆盖您想要模拟的方法(这与 Moq 的工作方式基本相同)。但是,这假定您的方法是virtualinFoo。 -
如果你想对
Foo类进行单元测试,那么你不应该模拟它。只需创建一个类的实例并在其上调用方法。 -
您不能使用模拟部分测试一个类。 Mock 是一个模拟对象...不是实际对象...所以它不代表您的类的实际代码。当一个方法调用另一个方法并且它们都是公共的时,你不能模拟它们的输出。