2013-09-09 1 views
1

Я только что перешел на использование расширения для моих тестов (NSubstitute) NInject.MockingKernel.Limit Ninject.MockingKernel для издевательских классов только в моих собственных пространствах имен

Однако очень сложно запускать тесты интеграции с Web API, так как он также возвращает mocks для всех интерфейсов Web API.

Могу ли я автоматически ограничивать свое приложение только собственными пространствами имен?

ответ

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>(); 
    } 
} 

Update Вы правы, вам не нужно, чтобы создать свое собственное ядро. Вы также можете сделать это так.

var kernel = new NSubstituteMockingKernel(); 
kernel.Components.RemoveAll<IMissingBindingResolver>(); 
kernel.Components.Add<IMissingBindingResolver, SingletonSelfBindingResolver>(); 
kernel.Components.Add<IMissingBindingResolver, NamespaceFilteringMockMissingBindingsResolver>(); 

Создание собственного ядра может быть более удобным, чем всегда писать эти дополнительные строки. Или вы создаете какой-то заводский метод.

+0

Блестящий, спасибо. Является ли 'Components' частным, и вы создали новое ядро ​​вместо добавления к существующим компонентам? – georgiosd