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

标签 c# .net-core moq xunit

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

我试图理解为什么调用 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);
  }
}

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

谢谢!

最佳答案

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

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

关于c# - 为什么调用 someMockInstance.Object 会调用构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69972419/

相关文章:

c# - .net 核心 : incomplete JSON response

c# - 在单元测试中方法执行后设置变量名称

moq - 如何使用 Moq 在 protected 方法上设置回调?

c# - 在 C# 中选中和取消选中 TreeView 的所有节点

c# - 如何在 mouseOver 上更改按钮背景图像?

ssl - .net core WebAPI 为内网启用 SSL

c# - 如何使用最小起订量设置只读属性?

c# - 如何使用c#访问串口

java - C# 客户端 Java 服务器 HTTP 无响应

c# - 不支持的 API 版本与 URI 中的版本 — 怎么了?