2008-10-22 7 views
9

Estoy usando Microsoft WebTest y quiero poder hacer algo similar a Assert.Fail() de NUnit. Lo mejor que se me ocurre es throw new webTestException(), pero esto se muestra en los resultados de la prueba como Error en lugar de Failure.¿Cómo puedo reprobar una prueba web?

Aparte de reflejar en el WebTest para establecer una variable de miembro privado para indicar el error, ¿hay algo que he omitido?

EDITAR: También he usado el método Assert.Fail(), pero esto todavía aparece como un error en lugar de una falla cuando se usa desde WebTest, y la propiedad Outcome es de solo lectura (no tiene un setter público).

EDITAR: bueno, ahora estoy realmente perplejo. Utilicé el reflejo para configurar la propiedad Outcome en Failed pero la prueba todavía pasa.

Aquí está el código que establece la Oucome a fallado:

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

y aquí está el código que estoy tratando de fallar:

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

Outcome es conseguir crear a Oucome.Fail pero al parecer el WebTest framework realmente no usa esto para determinar los resultados de aprobación/falla de prueba.

Respuesta

2

Ajuste el Outcome property a Falla:

Outcome = Outcome.Fail; 

También hay un Assert.Fail() en el ensamblajeMicrosoft.VisualStudio.QualityTools.UnitTestFramework.

+0

debería haber sido más clara ... que tenía Ya probé ambos. (pregunta editada para reflejar esto) – craigb

+0

[Microsoft.VisualStudio.QualityTools.WebTestFramework, Version = 9.0.0.0] Microsoft.VisualStudio.TestTools.WebTesting.WebTest.set_Outcome (Microsoft.VisualStudio.TestTools.WebTesting.Outcome value) es público –

+0

No de acuerdo con el dll que estoy usando. Oucome es un comprador público, pero no hay un organismo público. Utilicé el reflejo para cal el set_Outcome (que es privado) pero aún no tiene efecto en el resultado de la prueba (es decir, hasta que no falla) – craigb

1

La propiedad Resultado fijará el público en VSTS 2010 :-)

1

¿Qué tal:

Assert.IsTrue(false); 

no he verificado que, por lo que es posible que se obtendría informó como un error justo como Assert.Fail(), y acepto que es un truco. Pero dado que Assert.Fail() no parece funcionar de la manera que usted espera, y tampoco lo hace, no veo otra opción.

1

Hace que una prueba siempre falle agregando una regla de validación que siempre falla. Por ejemplo, podría escribir una regla de validación fallará así:

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

luego coloque la nueva regla de validación que evento ValidateResponse de su webtest, así:

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

establecer el valor de Resultado en el PostWebTest controlador de eventos.

1

una solución que trabajar en las pruebas declarativas (así como codificada) es:

  • escribir una regla de validación que falla cuando un cierto contexto de parámetros (por ejemplo,'FALLO') está presente en el Contexto
  • cuando se desea activar el fracaso, establecer el contexto de parámetros y llamar WebTest.Stop()
  • añadir la regla de validación como regla de nivel WebTest (no pedir nivel) para que se ejecute en todas las solicitudes

Creo que es lo más conciso que se puede hacer.

1

En primer lugar, estoy trabajando con VB.net, pero también intenté establecer el resultado para que fallara antes de descubrir que no funciona (lo que me trajo aquí).

fin he conseguido hacerlo con sólo una excepción:

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 

Sé que este tema es viejo, pero espero que ayude a alguien de todos modos :)

Cuestiones relacionadas