2016-04-21 2 views
4

У меня есть пользовательский контейнер IOC, который принимает параметр Interface и Concrete в качестве параметра для регистрации. В моем проекте я зарегистрировал конфигурацию, как указано в приведенном ниже коде. Можете ли вы мне помочь кому-то зарегистрироваться в проекте модульного тестирования с помощью NSubstitute?Использование Nsubstitute для регистрации или настройки контейнера IOC

МОК -Conatincer.cs

Register<Intf, Impl>(); 

Применение - Configuration.cs

Register<ICustomer,Customer>(); 

Unit Test Application - CustomerTest.cs

Register<ICustomer,StubCustomer>(); -I want something like this 
var substitute = Substitute.For<ICustomer>(); but It provides something like this 

ответ

0

Я не думаю, что вы можете иметь бетон экземпляр, который должен быть разрешен Unity, а затем иметь свойства/методы NSubstitute, доступные на нем.

Поскольку вы намерены выполнять модульное тестирование, вам нужно использовать экземпляр, разрешенный NSubstitue, потому что только с этим экземпляром вы сможете настроить свойства/метод для возврата объектов или проверить, были ли получены вызовы.

0

Там нет прямого способа использования как бетон класса, в качестве обходного добавил еще один перегруженный метод для регистра(), и передавая в качестве параметра

Container.cs

public class IOCContainer 
{ 
    static Dictionary<Type, Func<object>> registrations = new Dictionary<Type, Func<object>>(); 
    public static void Register<TService, TImpl>() where TImpl : TService 
    { 
     registrations.Add(typeof(TService),() => Resolve(typeof(TImpl))); 
    } 
    public static void Register<TService>(TService instance) 
    { 
     registrations.Add(typeof(TService),() => instance); 
    } 
    public static TService Resolve<TService>() 
    { 
     return (TService)Resolve(typeof(TService)); 
    } 
    private static object Resolve(Type serviceType) 
    { 
     Func<object> creator; 
     if (registrations.TryGetValue(serviceType, out creator)) return creator(); 
     if (!serviceType.IsAbstract) return CreateInstance(serviceType); 
     else throw new InvalidOperationException("No registration for " + serviceType); 
    } 
    private static object CreateInstance(Type implementationType) 
    { 
     var ctor = implementationType.GetConstructors().Single(); 
     var parameterTypes = ctor.GetParameters().Select(p => p.ParameterType).ToList(); 
     var dependencies = parameterTypes.Select(Resolve).ToArray();    
     return Activator.CreateInstance(implementationType, dependencies); 
    } 
} 

Configuration.cs

IOCContainer.Register(Substitute.For<IProvider>()); 
IOCContainer.Register(Substitute.For<ICustomer>()); 
Смежные вопросы