将 Ninject.MockingKernel 限制为仅在我自己的命名空间中模拟类

本文关键字:自己的 我自己 命名空间 模拟类 MockingKernel Ninject | 更新日期: 2023-09-27 18:30:46

我刚刚切换到使用NInject.MockingKernel扩展进行测试(NSubstitute)。

但是,运行我的 Web API 集成测试非常困难,因为它也会返回所有 Web API 接口的模拟。

我可以自动将其应用程序限制为仅我自己的命名空间吗?

将 Ninject.MockingKernel 限制为仅在我自己的命名空间中模拟类

我不明白这是怎么开箱即用的。尽管自己创建这样的内核并不难。

这个例子当然是非常简约的,但它应该告诉你如何做到这一点。或者也许有人对 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>();

创建自己的内核可能比总是编写这些额外的行更方便。或者您创建某种工厂方法。