2008-10-22 11 views
9

Ich verwende Microsoft WebTest und möchte in der Lage sein, etwas Ähnliches wie NUnit Assert.Fail() zu tun. Das beste, was ich mir ausgedacht habe, ist throw new webTestException(), aber dies zeigt in den Testergebnissen als Error eher als Failure.Wie kann ich einen WebTest nicht bestehen?

Anders als auf die WebTest reflektieren, um eine private Member-Variable, um den Fehler anzuzeigen, gibt es etwas, das ich verpasst habe?

EDIT: Ich habe auch die Assert.Fail() Methode verwendet, aber dies zeigt immer noch als Fehler und nicht als Fehler bei der Verwendung von WebTest, und die Outcome Eigenschaft ist schreibgeschützt (hat keine öffentlichen Setter).

EDIT: Nun, jetzt bin ich wirklich ratlos. Ich habe Reflection verwendet, um die Outcome-Eigenschaft auf Failed zu setzen, aber der Test ist immer noch passiert!

Hier ist der Code, der die Oucome zu ausgefallen setzt:

public static class WebTestExtensions 
{ 
    public static void Fail(this WebTest test) 
    { 
     var method = test.GetType().GetMethod("set_Outcome", BindingFlags.NonPublic | BindingFlags.Instance); 
     method.Invoke(test, new object[] {Outcome.Fail}); 
    } 
} 

und hier ist der Code, den ich nicht bin versucht: zu Oucome.Fail

public override IEnumerator<WebTestRequest> GetRequestEnumerator() 
    { 
     this.Fail(); 
     yield return new WebTestRequest("http://google.com"); 
    } 

Outcome gesetzt zu werden, aber anscheinend die WebTest Rahmen verwendet dies nicht wirklich, um Test-Bestanden/Nicht bestanden-Ergebnisse zu bestimmen.

Antwort

2

Stellen Sie die Outcome property-Ausfallen:

Outcome = Outcome.Fail; 

Es gibt auch eine Assert.Fail() in der Microsoft.VisualStudio.QualityTools.UnitTestFramework Montage.

+0

klarer hätte ... ich hatte habe schon beides versucht. (bearbeitete Frage, um das widerzuspiegeln) – craigb

+0

[Microsoft.VisualStudio.QualityTools.WebTestFramework, Version = 9.0.0.0] Microsoft.VisualStudio.TestTools.WebTesting.WebTest.set_Outcome (Microsoft.VisualStudio.TestTools.WebTesting.Outcome-Wert) ist öffentlich –

+0

Not nach der DLL, die ich benutze. Oucome ist ein öffentlicher Getter, aber es gibt keinen öffentlichen Setter. Ich habe Reflektion verwendet, um das Set_Outcome (das privat ist) zu berechnen, aber es hat immer noch keine Auswirkung auf das Testergebnis (d. H. Es schlägt nicht fehl) – craigb

1

Die Outcome-Eigenschaft wird die Öffentlichkeit in VSTS 2010 :-)

1

eingestellt Wie wäre:

Assert.IsTrue(false); 

ich es nicht überprüft haben, so dass es möglich ist, es als Fehler gemeldet werden würde einfach wie Assert.Fail(), und ich stimme zu, es ist ein Hack. Aber da Assert.Fail() nicht so funktioniert, wie Sie es erwarten, und auch nicht, wenn Sie Outcome einstellen, sehe ich keine andere Wahl.

1

Sie lassen einen Test immer fehlschlagen, indem Sie eine Validierungsregel hinzufügen, die immer fehlschlägt. Zum Beispiel könnten Sie eine fehlschlagen Gültigkeitsregel wie folgt schreiben:

public class FailValidationRule : ValidationRule 
{ 
    public override void Validate(object sender, ValidationEventArgs e) 
    { 
     e.IsValid = false; 
    } 
} 

dann die neue Gültigkeitsregel legen Sie Ihren Sie webtest die ValidateResponse Ereignis, etwa so:

public class CodedWebTest : WebTest 
{ 
    public override IEnumerator<WebTestRequest> GetRequestEnumerator() 
    { 
     WebTestRequest request1 = new WebTestRequest("http://www.google.com"); 
     FailValidationRule failValidation = new FailValidationRule(); 
     request1.ValidateResponse += new EventHandler<ValidationEventArgs>(failValidation.Validate); 
     yield return request1; 
    } 
} 
0

den Wert von Outcome in der PostWebTest Set Ereignishandler.

1

Eine Lösung, die in deklarativen Tests (wie auch codiert) arbeiten würde, ist:

  • eine Gültigkeitsregel schreiben, die bei einem bestimmten Kontext Parameter fehlschlägt (z.B."FAIL") ist im Kontext vorhanden
  • Wenn Sie den Fehler auslösen möchten, setzen Sie den Kontextparameter und rufen Sie WebTest.Stop()
  • die Validierungsregel als WebTest-Ebene Regel (nicht Anforderungs-Ebene) so dass es auf alle Anfragen

läuft Ich denke, das ist so knapp wie es möglich ist.

1

Zunächst arbeite ich mit VB.net, aber ich habe auch versucht, das Ergebnis zu scheitern, bevor es herausfindet, dass es nicht funktioniert (was mich hierher brachte).

ich es endlich geschafft, es zu tun, indem nur eine Ausnahme zu werfen:

Public Overrides Sub PostRequest(ByVal sender As Object, ByVal e As PostRequestEventArgs) 

    If YourTest = True Then 

     Throw New WebTestException("My test Failed") 

    End If 

    MyBase.PostRequest(sender, e) 

    End Sub 

Ich weiß, das Thema ist alt, aber ich hoffe, dass es jemand trotzdem hilft :)

Verwandte Themen