2017-09-22 4 views
1

Wir verwenden Unity als unser Injection-Injection-Framework.Verwenden der Abhängigkeitsinjektion in der SpecFlow-Schrittdatei

Ich möchte einen Abnahmetest erstellen und benötige eine Instanz von DossierService.
Leider bekomme ich die folgende Ausnahme:

BoDi.ObjectContainerException: 'Schnittstelle kann nicht aufgelöst werden [...]'

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

    public DossierServiceSteps(IDossierService dossierService) 
    { 
     this.dossierService = dossierService; 
    } 
} 
  • Was genau ist Bodi? Ich kann keine nützlichen Informationen finden.
  • Wie kann ich SpecFlow anweisen, den normalen Unity-Container zu verwenden?

Vielen Dank im Voraus

Edit: Ich habe SpecFlow.Unity wie so versucht, mit:

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

In UnityConfig die Typen sind

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

Aber ich richtig

registriert bekomme immer noch die gleichen Ausnahmen auf. Wenn ich einen Breakpoint am Anfang der CreateContainer() Methode von TestDependencies setze, bricht es nicht ...

Antwort

1

Wir lösten dieses Problem, indem wir SpecFlow RuntimePlugin implementierten. In unserem Fall war es Castle.Windsor, aber das Prinzip ist das gleiche. Zuerst definieren Sie das Plugin die Überschreibung Standard SpecFlow Instanz Resolver:

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

Wo in CastleWindsorBindingInstanceResolver wir brauchten einzelne Methode zu implementieren: object ResolveBindingInstance(Type bindingType, IObjectContainer scenarioContainer);. Diese Klasse enthält Container und Auflösung (in Ihrer Fallinstanz IUnityContainer. Ich empfehle, in die Container-Instanz von self zu injizieren, so dass Sie die Instanz IUnityContainer zu SpecFlow-Bindungsklassen injizieren können)

Dieses Plugin muss separat sein Assembly und Sie laden, dass zu Ihrem Testprojekt wie app.config wie folgt anpassen:

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