1

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

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

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

4

1 回答 1

0

我不明白这是如何开箱即用的。虽然自己创建这样的内核并不是很难。

这个示例当然是非常简约的,但它应该向您展示它是如何完成的。或者也许有人对 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>();

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

于 2013-09-10T15:50:02.177 回答