Moq在C#中设置混乱

Nat*_*han 0 c# moq

所以我有以下课程:

public class MyClass {
  internal void A() {
    foreach(Thing thing in ThingArray)
      B(thing);
  }

  virtual internal void B(Thing thing)
  {
    //  do some stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我有以下测试:

...
var testObject = new Mock<MyClass>(parameters);
testObject.Setup(t => t.B(It.IsAny<Thing>()));

test.Object.A();

test.Verify(t => t.B(It.IsAny<Thing>()), Times.Exactly(2));
Run Code Online (Sandbox Code Playgroud)

验证失败了.我已经检查过,代码调用真正的 B()方法而不是模拟的B()方法.

我有很多代码在Moq完美运行的地方运行,我编码的时间足够长,以至于我必须在这里做错事,但对于我的生活,我看不到它.我一直在假设自从我打电话测试.对象 .A(),对B()的调用不是通过模拟,但这对我来说没有任何意义,因为来自任何其他对象的调用将起作用相同...

那么为什么在地球上不是被执行的模拟设置呢?

编辑:是的,我有测试项目可见的内部.我打算把它放到原帖中,因为我知道有人会提到它.

至于真正的代码,遗憾的是非常专有,所以我不能发布它.我会看看明天是否可以调整代码以使其实际编译.

Gam*_*lor 7

你的模拟对象必须符合这个标准才能成功模拟一个方法:

  • 它必须是一个界面
  • 或者您想要模拟的方法必须是虚拟方法和公共方法.

现在你也可以模拟虚拟内部方法,但是为了允许你必须让Moq访问你的内部.你可以这样做:

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
Run Code Online (Sandbox Code Playgroud)

这使得内部可以访问Moq的代码生成器.

所以为了模拟你的MyClass.A电话,你必须这样做:

  1. 让你的方法A虚拟.
  2. 并使您的方法公开或允许访问

    [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
    
    Run Code Online (Sandbox Code Playgroud)

或者如上所述,创建一个代表MyClass API的接口.