Desafortunadamente, esto no es particularmente fácil de hacer, ya que la aplicación Http no se presta para burlarse muy fácilmente; no hay una interfaz para burlarse y la mayoría de los métodos no están marcados como virtuales.
Recientemente tuve un problema similar con HttpRequest y HttpWebResponse. Al final, la solución fui a era crear una envoltura recta de la "transferencia" de los métodos que quería utilizar:
public class HttpWebRequestWrapper : IHttpWebRequestWrapper
{
private HttpWebRequest httpWebRequest;
public HttpWebRequestWrapper(Uri url)
{
this.httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
}
public Stream GetRequestStream()
{
return this.httpWebRequest.GetRequestStream();
}
public IHttpWebResponseWrapper GetResponse()
{
return new HttpWebResponseWrapper(this.httpWebRequest.GetResponse());
}
public Int64 ContentLength
{
get { return this.httpWebRequest.ContentLength; }
set { this.httpWebRequest.ContentLength = value; }
}
public string Method
{
get { return this.httpWebRequest.Method; }
set { this.httpWebRequest.Method = value; }
}
public string ContentType
{
get { return this.httpWebRequest.ContentType; }
set { this.httpWebRequest.ContentType = value; }
}
}
etc, etc
Esta vamos burlan de mí en contra de mi propio envoltorio interfaz. No necesariamente es la cosa más elegante del mundo, pero es una forma muy útil de burlarse de algunas de las partes menos "ficticias" del marco.
Antes de que se apresure y haga esto, vale la pena revisar lo que tiene y ver si hay un mejor enfoque para sus pruebas que evitaría tener que envolver las clases.
En el caso de HttpWebRequest, HttpApplication et al, a menudo no hay en mi humilde opinión.
Con el fin de establecer este envoltorio con fingida (usando mi HttpWebRequest ejemplo anterior), a continuación, hacer cosas como esta con Moq:
var mockWebRequest = new Mock<IHttpWebRequestWrapper>();
mockWebRequest.SetupSet<string>(c => c.Method = "POST").Verifiable();
mockWebRequest.SetupSet<string>(c => c.ContentType = "application/x-www-form-urlencoded").Verifiable();
mockWebRequest.SetupSet<int>(c => c.ContentLength = 0).Verifiable();
Gracias por la info! Refactoreé las cosas un poco, por lo que la mayoría de las funcionalidades adicionales se encuentran ahora en una clase externa que puede crearse solo con una HttpContextBase burlada en lugar de confiar en HttpApplication. –