1

Ich erhalte einen Fehler in meinem SpecFlow Unit-Test:Abrufen von Text in <td> Elemente mit SpecFlow und Selen

System.Collections.Generic.KeyNotFoundException: Der angegebene Schlüssel nicht im Wörterbuch vorhanden war. bei TechTalk.SpecFlow.SpecFlowContext.Get [T] (String-Schlüssel) bei F *****. Live.PS. *******. Schritte. *******. EnterStagingDateAndSaveSteps.ThenUserSeesInNEXTRE_ENROLMENTWINDOWTextFieldInPENSIONASSESSMENTDATESPageInPENSIONModule (String p0) in c: \ Git \ LivePersonalsystemTests \ Fourth.Live.PS.AutomationTests \ F *****. Live.PS. *******. Schritte ******* \ EnterStagingDateAndSaveSteps. cs: Linie 175

Hier ist die referenzierte Methode in EnterStagingDateAndSaveSteps.cs

[Then(@"user sees ""(.*)"" in NEXT RE-ENROLMENT WINDOW Text Field in PENSION ASSESSMENT DATES page in PENSION module")] 
    public void ThenUserSeesInNEXTRE_ENROLMENTWINDOWTextFieldInPENSIONASSESSMENTDATESPageInPENSIONModule(string p0) 
    { 
     // GetNextReEnrollmentWindow 
     string validator = 
      ScenarioContext.Current.Get<PensionAssessmentDates>("_nextReEnrollmentWindow") 
       .GetNextReEnrollmentWindow(); 
     Assert.IsTrue(validator == p0); 
    } 

(ich habe auch versucht return Driver.WaitAndGetText(_nextReEnrollmentWindow); dort)

so sieht es aus wie der Schlüssel _nextReEnrollmentWindow existiert nicht, aber hier ist es in PensionAssessmentDates.cs definiert:

private readonly By _nextReEnrollmentWindow = By.Id("NextReEnrollmentWindow"); 

enter image description here

Die PensionAssessmentSteps wird in die ScenarioContext.Current wie folgt:

[Then(@"user sees ""(.*)"" in NEXT RE-ENROLMENT WINDOW Text Field in PENSION ASSESSMENT DATES page in PENSION module")] 
    public void ThenUserSeesInNEXTRE_ENROLMENTWINDOWTextFieldInPENSIONASSESSMENTDATESPageInPENSIONModule(string p0) 
    { 
     // GetNextReEnrollmentWindow 
     string validator = 
      ScenarioContext.Current.Get<PensionAssessmentDates>("_nextReEnrollmentWindow") 
       .GetNextReEnrollmentWindow(); 
     Assert.IsTrue(validator == p0); 
    } 

und hier ist die eigentliche Web-Seite, die ich zeige, das Element zu testen versuchen existiert:

enter image description here

Ich wäre dankbar für alle Hinweise oder Ratschläge, was, die ich verpasst mein Unit-Test verursacht, wie unten zu stoppen :

EnterStagingDateAndSaveSteps.WhenUserClicksSAVEButtonUnderAUTOMATICENROLMENTATSTAGINGDATEFrameInPENSIONASSESSMENTDATESPageInPENSIONModule() (0.7s) 
Then user sees "02 Oct 2019 to 02 Apr 2020" in NEXT RE-ENROLMENT WINDOW Text Field in PENSION ASSESSMENT DATES page in PENSION module 
-> error: The given key was not present in the dictionary. 
+1

wo setzen Sie die 'PensionAssessmentDates' in' ScenarioContext.Current'? Ich habe das Gefühl, Sie haben ein grundlegendes Missverständnis darüber, wie das funktioniert ... –

+0

@SamHolder: Hallo Sam, es ist in der Datei 'EnterStagingDateAndSaveSteps.cs' - Ich werde diesen Code mit einer Bearbeitung hinzufügen ... –

+0

@SamHolder: Ja, es ist auf jeden Fall möglich, dass ich etwas Grundlegendes verpasst habe! –

Antwort

2

die ScenarioContext.Current.Get und Set Methoden einfach können Sie ein Objekt in das Wörterbuch der Werte der aktuellen Szenario mit einem Schlüssel befestigt hinzuzufügen.

Sobald Sie dem Wörterbuch ein Element in einem Schritt hinzugefügt haben, können Sie es in einem anderen Schritt abrufen. Die Ausnahme, die Sie erhalten, bedeutet, dass Sie dem Wörterbuch mit dem Schlüssel _nextReEnrollmentWindow nichts hinzugefügt haben.

Rufen Sie ScenarioContext.Current.Set("_nextReEnrollmentWindow", something); irgendwo in Ihrem Code? Ich vermute nicht.

so, wie Sie die Frage gestellt haben Gegeben ich den Verdacht, dass Sie die ScenarioContext.Current.Get<PensionAssessmentDates>("_nextReEnrollmentWindow") Anruf erwarten Sie die aktuelle Instanz der Seite Objekt vom Typ PensionAssessmentDates und dann das Element der _nextReEnrollmentWindow Selektor erhalten zu bekommen. So funktioniert es nicht.

Sie wollen eines von zwei Dingen, die ich glaube. Fügen Sie entweder Ihr Seitenobjekt PensionAssessmentDates zur ScenarioContext.Current hinzu und rufen Sie dann das Seitenobjekt ab und rufen Sie die Methode auf, die das private Feld _nextReEnrollmentWindow verwendet.

Oder (viel besser meiner Meinung nach) Graben Sie Ihre Verwendung der ScenarioContext.Current insgesamt und stattdessen erstellen Sie Objekte, die Ihre Seite Objekte halten und lassen Sie Specflows internal DI framework provide those to your step classes using context injection.

+1

zu verwenden. Es ist bemerkenswert, dass' ScenarioContext.Current' nicht verwendbar ist, wenn Ihre Tests parallel ausgeführt werden und wahrscheinlich irgendwann überflüssig werden (wahrscheinlich die nächste Hauptversion). IMHO Context Injection ist eine viel bessere Lösung, die es Ihnen ermöglicht, verwandte Funktionen zusammenzuhalten und nicht nur jedes einzelne Stück geteilte Daten in einem einzigen großen Wörterbuch zu speichern. –

+1

Danke, ein Kollege hat mir meinen ** DOH ** Fehler gezeigt, den ich benutzt habe "_nextReEnrollmentWindow" als Schlüssel, wenn es sein sollte "ScenarioContext.Current.Get (" PensionAssessmentDates ")" .... –

+0

Schön, dass Sie es sortiert haben. Ich würde ernsthaft über Context-Injection über den 'ScenarioContext nachdenken .Current' aus Gründen, die vorher gegeben wurden ... –