是否可以使用 MockingKernel 自动生成模拟对象,如果与之交互,将引发异常(又名破坏者)?
当您想要获取具有各种依赖项的对象时,这很有用,但您知道您的代码应该只与其中一些进行交互。如果您没有明确地Bind
依赖(通过ToMock
等),它应该返回一个在第一次与之交互时抛出异常的对象。
这比等到代码完成执行,然后编写一堆检查以确保您没有调用模拟要好得多。
这已经存在了吗?
是否可以使用 MockingKernel 自动生成模拟对象,如果与之交互,将引发异常(又名破坏者)?
当您想要获取具有各种依赖项的对象时,这很有用,但您知道您的代码应该只与其中一些进行交互。如果您没有明确地Bind
依赖(通过ToMock
等),它应该返回一个在第一次与之交互时抛出异常的对象。
这比等到代码完成执行,然后编写一堆检查以确保您没有调用模拟要好得多。
这已经存在了吗?
上面提供的答案没有说明如何使用 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
}
我一直在使用 NSubstitute 的 MockingKernel 实现。NSubstitute 并不真正支持“严格”模式,您无法通过NSubstituteMockingKernel
类对其进行配置。
但是,您可以将 Moq 配置为执行严格模式。最重要的是,MoqMockingKernel
该类允许您全局更改模拟行为。这样,任何未配置的调用都会导致抛出异常。
这正是我一直在寻找的。唯一的痛苦是从 NSubstitute 切换到 Moq。