使用破坏者的Ninject MockingKernel

时间:2014-08-13 19:37:05

标签: ninject ninject-extensions ninject-mockingkernel

是否可以使用MockingKernel,以便自动生成模拟对象,如果与之交互,将抛出异常(a.k.a,saboteurs)?

当您想要获得具有各种依赖关系的对象时,这很有用,但您知道您的代码应该只与其中一些对象进行交互。如果您没有明确Bind依赖项(通过ToMock等),它应该返回一个在第一次与之交互时抛出异常的对象。

这比等待代码完成执行要好得多,然后写一堆检查以确保没有调用模拟。

这是否已经存在?

2 个答案:

答案 0 :(得分:1)

上面提供的答案并没有说明如何使用MOQ设置Ninject MockingKernel,因此默认行为是Strict。为了别人的利益,这就是我找到的。

Ninject.MockingKernel.Moq命名空间为类NinjectSettingsExtensions提供方法SetMockBehavior()和GetMockBehavior(),允许您指定要用作全局默认值的模拟行为。我无法找到任何方法来覆盖单个GetMock()请求的默认值。

using Ninject;
using Ninject.MockingKernel.Moq;
var kernelSettings = new NinjectSettings();
kernelSettings.SetMockBehavior(MockBehavior.Strict);
using(var kernel = new MoqMockingKernel(kernelSettings))
{
    var mockFoo = kernel.GetMock<IFoo>(); // mockFoo.Behavior == MockBehavior.Strict
}

答案 1 :(得分:0)

我一直在使用NSubstitute的MockingKernel实现。 NSubstitute并不真正支持&#34;严格&#34;模式,您无法通过NSubstituteMockingKernel类进行配置。

但是,您可以配置Moq以执行严格模式。最重要的是,MoqMockingKernel类允许您全局更改模拟行为。这样,任何未配置的调用都会导致抛出异常。

这正是我想要的。唯一的痛苦是从NSubstitute转向Moq。