如何使用Ninject.MockingKernel?

mbe*_*Net 3 ninject mocking

我正在尝试使用Ninject.MockingKernel.Moq.我有两个问题:

  1. 我要注册我想要模拟的所有类型.如果我不这样做,我的类的无参数构造函数被调用,这不是automocker的目的
  2. 似乎即使调用模拟,验证也失败了.请看以下示例

示例代码:

//Arrange
var kernel = new Ninject.MockingKernel.Moq.MoqMockingKernel();
kernel.Bind<ClassUnderTest>().ToSelf();
kernel.Bind<ILogger>().ToMock();
kernel.GetBindings(typeof(ILogger));
//Act
var sut = kernel.Get<ClassUnderTest>();
sut.DoSomething();//Logger.Log is called inside that method
//Assert
var mock = kernel.GetMock<ILogger>();
mock.Verify(x => x.Log(It.IsAny<string>()), Times.Exactly(1));
Run Code Online (Sandbox Code Playgroud)

Rem*_*oor 8

对于可自绑定类型(如非抽象类),默认情况下会返回该类的实例.这背后的意图是使最常见的用例变得容易,其中类的解析是被测试的对象,并且所有依赖关系被定义为接口.

使用类作为依赖项并不常见,因为它只允许模拟虚拟方法.如上所述,这种不常见的情况使得普通的情况变得更加复杂.

另一方面,接口不需要任何绑定.

如果你想要模拟你必须定义的类

// note the scope so that you can access it later again
kernel.Bind<Foo>().ToMock().InSingletonScope(); 
var mock = kernel.GetMock<Foo>()
Run Code Online (Sandbox Code Playgroud)