Sfortunatamente, questo non è particolarmente facile da fare, in quanto la HttpApplication non si presta a sbeffeggiare molto facilmente; non esiste un'interfaccia per deridere e la maggior parte dei metodi non sono contrassegnati come virtuali.
Recentemente ho avuto un problema simile con HttpRequest e HttpWebResponse. Alla fine, la soluzione sono andato per era quello di creare un involucro dritta "pass-through" per i metodi che ho voluto usare:
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; }
}
}
ecc, ecc
Questo mi prendo gioco contro il mio involucro interfaccia. Non è necessariamente la cosa più elegante del mondo, ma è un modo molto utile di prendere in giro alcune delle parti meno "schernibili" del framework.
Prima di precipitarsi e fare questo però, vale la pena rivedere quello che hai e vedere se c'è un approccio migliore per i test che eviterebbe di dover avvolgere classi.
Nel caso di HttpWebRequest, HttpApplication et al, spesso non c'è IMHO.
Per impostare questo involucro in finto (usando il mio HttpWebRequest esempio di cui sopra) si poi fare cose come questa 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();
fonte
2009-07-25 16:25:44
Grazie per le informazioni! Ho rifattorato un po 'le cose, quindi la maggior parte delle funzionalità extra ora si trova in una classe esterna che può essere creata con un HttpContextBase solo per il gioco delle mire invece di fare affidamento sull'HttpApplication. –