如何使用Ninject.MockingKernel?

时间:2011-03-16 19:00:04

标签: mocking ninject

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

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

    //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));
    

1 个答案:

答案 0 :(得分:8)

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

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

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

如果你想模拟类,你必须定义

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