我刚刚切换到使用NInject.MockingKernel
扩展程序进行测试(NSubstitute)。
但是,运行我的 Web API 集成测试非常困难,因为它也会返回所有 Web API 接口的模拟。
我可以自动将其应用程序限制为我自己的命名空间吗?
我刚刚切换到使用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>();
创建自己的内核可能比总是编写那些额外的行更方便。或者您创建某种工厂方法。