为什么调用someMockInstance.Object调用构造函数



如果这真的很明显,很抱歉。。。

我试图理解为什么调用someMockInstance.Object会调用类构造函数。

这里有一个例子:

public class Foo
{
public Foo()
{
// Init some stuff
}

public virtual string DoSomething()
{
// Blah
}
}
public class BarTest
{
[Fact]
public void SomeMethod()
{
var mockFoo = new Mock<Foo>();
mockFoo.Setup(m => m.DoSomething()).Returns("SomeValue");
// This causes a call to `Foo.Foo()`
var result = new Bar(mockFoo.Object).SomeMethod();
result.Should().Be(true);
}
}

我想同样重要的是,我们能避免它吗?

谢谢!

您在嘲笑一个具体的类(而不是接口(。为此,Moq将动态地创建一个类,该类将Foo子类化。

然而,子类总是需要在其基类上调用构造函数,因此这个动态创建的子类将调用Foo的无参数构造函数。这是.NET运行时强加的一条规则,Moq不能打破它。