2011-06-25 14 views
5

Estoy escribiendo una prueba unitaria para un servicio web WCF. Estoy enviando deliberadamente una solicitud no válida al servidor que arroja un WebExceptionFault<string>. En la prueba unitaria, la excepción que queda atrapada es EndpointNotFoundException con el estándar WebException en la propiedad InnerException. Quiero verificar que el cuerpo de la respuesta coincida con la cadena que creo que debería estar allí.Las propiedades de la excepción interna están expuestas?

Estoy llegando a un problema, sin embargo, como la propiedad Response de (que es System.Net.SyncMemoryStream) está Dispuesta y no se puede leer.

Mi código:

Clubs actual; 
try 
{ 
    //"201" is an invalid argument for the first parameter 
    actual = new Clubs(channel.GetClubs("201", "123")); 
} 
catch (EndpointNotFoundException e) 
{ 
    WebException w = e.InnerException as WebException; 
    Assert.IsNotNull(w); 

    HttpWebResponse resp = w.Response as HttpWebResponse; 
    Assert.IsNotNull(resp); 
    Assert.AreEqual(resp.StatusCode, HttpStatusCode.NotFound); 
    //Next line throws an ArgumentException saying Stream not readable 
    //Investigation shows it has been disposed 
    using (StreamReader sr = new StreamReader(resp.GetResponseStream())) 
     Assert.AreEqual(sr.ReadToEnd(), "League not allowed for selected club"); 
} 

¿Es normal que las propiedades de la InnerException están dispuestos? ¿Hay alguna forma de evitar esto?

+8

Eso es de esperar. System.Net no va a suponer que quien atrape la excepción va a tomarse la molestia de desenterrar el flujo de respuesta y deshacerse de él. Por lo tanto, se limpia antes de tirar. No puedes cambiar este comportamiento. –

+0

Seguramente no debería poder acceder al flujo de respuesta si la conexión subyacente está cerrada ¿no? En ese punto, casi seguramente lo habrá cerrado cuando empiece a procesar la excepción 'EndPointNotFoundException'. Creo que debería comenzar a procesar la excepción, ya que está capturada leyendo en la secuencia de respuesta de inmediato y terminando así. –

+0

@Jeff: ¿Cuándo se cierra la conexión subyacente en el ejemplo anterior? El primer punto que puedo ver para leer la secuencia de respuesta es después de obtener el 'HttpWebResponse'. ¿Es eso a lo que te refieres? – Clivest

Respuesta

Cuestiones relacionadas