我正在尝试使用Ninject.MockingKernel.Moq。我有两个问题:
示例代码:
//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));
答案 0 :(得分:8)
对于可自绑定类型(如非抽象类),默认情况下会返回该类的实例。这背后的意图是使最常见的用例变得容易,其中类的解析是被测对象,并且所有依赖关系都被定义为接口。
使用类作为依赖项并不常见,因为它只允许模拟虚拟方法。如上所述,这种不常见的情况使得普通的情况变得更加复杂。
另一方面,接口不需要任何绑定。
如果你想模拟类,你必须定义
// note the scope so that you can access it later again
kernel.Bind<Foo>().ToMock().InSingletonScope();
var mock = kernel.GetMock<Foo>()