【问题标题】:Why does calling someMockInstance.Object call constructor?为什么调用 someMockInstance.Object 调用构造函数?
【发布时间】:2021-12-26 13:02:25
【问题描述】:

对不起,如果这真的很明显......

我试图理解为什么调用 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的无参数构造函数
  • 很棒的解释-谢谢@canton7。你想发帖作为答案吗?这样我可以接受?
  • @LeeTickett 你想要部分模拟吗?如果有,请查看this thread
  • @PeterCsala 我们已经在一些地方这样做了-谢谢:)
  • 您确定通话发生在mockFoo.Object 而不是new Mock&lt;Foo&gt;()?

标签: c# .net-core moq xunit


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2011-09-07
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多