2017-06-07 2 views
0
public class BaseSteps : Steps 
{ 
    [BeforeFeature] 
    public static void BeforeFeatureStep() 
    { 
     var otherStep = new OtherStep(); 
     otherStep.ExecuteStep(); 
    } 
} 

public class OtherStep : Steps 
{ 
    public void ExecuteStep() 
    { 
     var key = 'key'; 
     var val = 'val'; 
     this.FeatureContext.Add(key, val); 
    } 
} 

Dies ist ein Beispielschnipsel. Wenn ich versuche, auf this.FeatureContext.Add() zuzugreifen, bekomme ich eine Ausnahme unter Angabe Container of the steps class has not been initializedDer Specflow-Container der steps-Klasse wurde nicht initialisiert.

Jede Hilfe zu diesem wird geschätzt.

Antwort

0

Der FeatureContext wird nicht initialisiert, da die Klasse Step nicht vom SpecFlow DI Container aufgelöst wird. So wird die SetObjectContainer- Methode nicht aufgerufen (https://github.com/techtalk/SpecFlow/blob/master/TechTalk.SpecFlow/Steps.cs#L10)

Als allgemeine Regel gilt, sollten Sie nicht die Schritte Klassen von Ihrem eigenen instanziiert, sondern bekommen sie über Context Injection (http://specflow.org/documentation/Context-Injection/).

Das ist aber in Ihrem Fall nicht möglich, da Sie sich in einem BeforeFeature-Hook befinden.

Eine mögliche Lösung wäre, dass Sie die neueste Vorabversion von SpecFlow (https://www.nuget.org/packages/SpecFlow/2.2.0-preview20170523) verwenden. Dort können Sie den FeatureContext via Parameter in der Hook-Methode abrufen. sieht wie folgt aus:

public class FeatureContextDriver 
{ 
    public void FeatureContextChangeing(FeatureContext featureContext) 
    { 
     var key = 'key'; 
     var val = 'val'; 
     featureContext.Add(key, val); 
    } 
} 

[Binding] 
public class BaseSteps : Steps 
{ 
    [BeforeFeature] 
    public static void BeforeFeatureStep(FeatureContext featureContext) 
    { 
     var featureContextDriver = new FeatureContextDriver(); 
     featureContextDriver.FeatureContextChangeing(featureContext); 
    } 
} 

[Binding] 
public class OtherStep : Steps 
{ 
    private FeatureContextDriver _featureContextDriver; 
    public OtherStep(FeatureContextDriver featureContextDriver) 
    { 
     _featureContextDriver = featureContextDriver; 
    } 

    public void ExecuteStep() 
    { 
     _featureContextDriver.FeatureContextChangeing(this.FeatureContext); 
    } 
} 

-Code getestet/ausprobiert nicht und wendet das Muster Treiber-:

[BeforeFeature] 
public static void BeforeFeatureHook(FeatureContext featureContext) 
{ 
    //your code 
} 

Ihr Code dann wie folgt aussehen könnte.


Vollständige Offenlegung: Ich bin einer der Betreuer von SpecFlow und SpecFlow +.

Verwandte Themen