2017-09-22 2 views
1

우리는 Unity를 의존성 주입 프레임 워크로 사용하고 있습니다.SpecFlow step-file에서 의존성 주입 사용

수락 테스트를 만들고 DossierService 인스턴스가 필요합니다. BoDi.ObjectContainerException

: '인터페이스가 해결할 수없는 [...]'정확히 BoDi 무엇

[Binding] 
public class DossierServiceSteps : BaseSteps 
{ 
    private IDossierService dossierService; 

    public DossierServiceSteps(IDossierService dossierService) 
    { 
     this.dossierService = dossierService; 
    } 
} 
  • 입니다
    불행히도 나는 다음과 같은 예외가? 유용한 정보를 찾을 수 없습니다.
  • SpecFlow에 일반 Unity 컨테이너를 사용하려면 어떻게해야합니까? 사전에

감사

편집 : 난과 같이 SpecFlow.Unity 사용하여 시도했다 :

public static class TestDependencies 
{ 
    [ScenarioDependencies] 
    public static IUnityContainer CreateContainer() 
    { 
     var container = UnityConfig.GetConfiguredContainer(); 

     container.RegisterTypes(typeof(TestDependencies).Assembly.GetTypes().Where(t => Attribute.IsDefined(t, typeof(BindingAttribute))), 
      WithMappings.FromMatchingInterface, 
      WithName.Default, 
      WithLifetime.ContainerControlled); 

     return container; 
    } 
} 

UnityConfig에서 유형이 제대로

container.RegisterType<IDossierService, DossierService>(new InjectionConstructor(typeof(IDataService), typeof(IDossierRepository), typeof(IDbContext), true)); 

을 등록하지만된다 여전히 같은 예외를 얻는다. 에. CreateContainer() 메서드의 시작 부분에 중단 점을 넣으면 TestDependencies은 깨지지 않습니다.

답변

1

SpecFlow RuntimePlugin을 구현하여이 문제를 해결했습니다. 우리의 경우에는 캐슬입니다. 윈저. 그러나 원리는 같습니다. 먼저 당신이 플러그인을 정의하는 재정의 기본 SpecFlow 인스턴스 확인자 : object ResolveBindingInstance(Type bindingType, IObjectContainer scenarioContainer); : CastleWindsorBindingInstanceResolver에서 우리는 하나의 메소드를 구현하는 데 필요한

public class CastleWindsorPlugin : IRuntimePlugin 
{ 
    public void Initialize(RuntimePluginEvents runtimePluginEvents, RuntimePluginParameters runtimePluginParameters) 
    { 
     runtimePluginEvents.CustomizeScenarioDependencies += (sender, args) => 
     { 
      args.ObjectContainer.RegisterTypeAs<CastleWindsorBindingInstanceResolver, IBindingInstanceResolver>(); 
     }; 
    } 
} 

. 이 클래스에는 컨테이너 및 해상도가 포함되어 있습니다 (IUnityContainer 케이스 인스턴스에서 IUnityContainer의 인스턴스를 SpecFlow 바인딩 클래스에 삽입 할 수 있도록 self 컨테이너 인스턴스에 삽입하는 것이 좋습니다)

이 플러그인은 별도로 존재해야합니다 어셈블리를 선택하고 을 다음과 같이 조정하여 테스트 프로젝트에로드합니다.

<specFlow> 
    <plugins> 
     <add name="PluginAssemblyName" path="." type="Runtime" /> 
    </plugins> 
... 
</specFlow>