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

Why does calling someMockInstance.Object call constructor?

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

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

这是一个例子:

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);
  }
}

而且我想同样重要的是,我们可以避免它吗?

谢谢!

您正在模拟具体的 class(而不是接口)。为此,Moq 将动态创建一个 class 子class 是 Foo.

然而,subclasses 总是需要在其基础 class 上调用构造函数,因此这个动态创建的 subclass 将调用 Foo 的无参数构造函数。这是 .NET 运行时强加的规则,Moq 无法打破。