首页 > 解决方案 > 为什么调用 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);
  }
}

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

谢谢!

标签: c#.net-coremoqxunit

解决方案


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

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


推荐阅读