将 Ninject.MockingKernel 限制为仅在我自己的命名空间中模拟类
本文关键字:自己的 我自己 命名空间 模拟类 MockingKernel Ninject | 更新日期: 2023-09-27 18:30:46
我刚刚切换到使用NInject.MockingKernel
扩展进行测试(NSubstitute)。
但是,运行我的 Web API 集成测试非常困难,因为它也会返回所有 Web API 接口的模拟。
我可以自动将其应用程序限制为仅我自己的命名空间吗?
我不明白这是怎么开箱即用的。尽管自己创建这样的内核并不难。
这个例子当然是非常简约的,但它应该告诉你如何做到这一点。或者也许有人对 Ninject 内部结构有更多了解。
public class NamespaceFilteringMockMissingBindingsResolver : MockMissingBindingResolver
{
public NamespaceFilteringMockMissingBindingsResolver(IMockProviderCallbackProvider mockProviderCallbackProvider)
: base(mockProviderCallbackProvider)
{
}
protected override bool TypeIsInterfaceOrAbstract(Type service)
{
return base.TypeIsInterfaceOrAbstract(service) && service.Namespace != null && service.Namespace.StartsWith("YourNamespace");
}
}
public class CustomNSubstituteMockingKernel : NSubstituteMockingKernel
{
public CustomNSubstituteMockingKernel()
{
this.AddComponents();
}
public CustomNSubstituteMockingKernel(INinjectSettings settings, params INinjectModule[] modules)
: base(settings, modules)
{
this.AddComponents();
}
private new void AddComponents()
{
this.Components.RemoveAll<IMissingBindingResolver>();
this.Components.Add<IMissingBindingResolver, SingletonSelfBindingResolver>();
this.Components.Add<IMissingBindingResolver, NamespaceFilteringMockMissingBindingsResolver>();
}
}
更新你是对的,你不需要创建自己的内核。你也可以这样做。
var kernel = new NSubstituteMockingKernel();
kernel.Components.RemoveAll<IMissingBindingResolver>();
kernel.Components.Add<IMissingBindingResolver, SingletonSelfBindingResolver>();
kernel.Components.Add<IMissingBindingResolver, NamespaceFilteringMockMissingBindingsResolver>();
创建自己的内核可能比总是编写这些额外的行更方便。或者您创建某种工厂方法。