2

Я пытаюсь выполнить тестирование Orchestrator.Castle.MicroKernel.ComponentNotFoundException - при модульном тестировании

//Arrange 
var containter = new WindsorContainer(); 
var Orch = containter.Resolve<ApiOrchestrator>();// Exception Thrown here 

Конструктор для Orchestrator является:

public ApiOrchestrator(IApiWrap[] apiWraps) 
{ 
    _apiWraps = apiWraps; 
} 

Регистрация является

public class IocContainer : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Component.For<FrmDataEntry>().LifestyleTransient()); 
     container.Register(Component.For<ApiOrchestrator>().LifestyleTransient()); 
     container.Register(Component.For<IApiWrap>().ImplementedBy<ClassA>().LifestyleTransient()); 
     container.Register(Component.For<IApiWrap>().ImplementedBy<ClassB>().LifestyleTransient()); 
    } 
} 

IocContainer находится в проекте испытывается, но ссылается пространство имен, и я могу new до Orchestrator. Я хочу, чтобы он просто дал мне массив всех зарегистрированных IApiWrap.

Будучи новым для Замка, я не понимаю, чего не хватает. Исправление кода было бы неплохо, но мне очень хотелось бы знать, почему контейнер, похоже, не зарегистрирован оркестром.

+0

Так что я думаю, что мне не хватает вызова метода установки из контейнера, но я не уверен, что использовать в качестве IWindsorInstaller –

ответ

2

ИТАК 3 вещи отсутствуют

  1. Ссылка на Castle.Windsor.Installer
  2. Вызов из контейнера в программу установки, чтобы «идти искать» все зарегистрированные классы.
  3. Установщик также должен был добавить вспомогательный резольвер, чтобы создать коллекцию классов, поскольку конкретная коллекция не была зарегистрирована, а коллекция IApiWrap требуется оркестром.

изменения Установщик

public class IocContainer : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     //New Line 
     container.Kernel.Resolver.AddSubResolver(
        new CollectionResolver(container.Kernel, true)); 

     container.Register(Component.For<FrmDataEntry>().LifestyleTransient()); 
     container.Register(Component.For<ApiOrchestrator>().LifestyleTransient()); 
     container.Register(Component.For<IApiWrap>().ImplementedBy<SettledCurveImportCommodityPriceWrap>().LifestyleTransient()); 
     container.Register(Component.For<IApiWrap>().ImplementedBy<ForwardCurveImportBalmoPriceWrap>().LifestyleTransient()); 
    } 
} 

Тест/Разрешающая Изменить

//Arrange 
     var container = new WindsorContainer(); 

     //New Line 
     container.Install(FromAssembly.InDirectory(new AssemblyFilter("","EkaA*"))); 

     var Orch = container.Resolve<ApiOrchestrator>(); 

Теперь он работает, хотя любое дальнейшее объяснение или исправление того, что делает код приветствуется.