Niestety, nie jest to szczególnie łatwe, ponieważ aplikacja HttpApplication nie nadaje się do kpiny; nie ma interfejsu, z którego możnaby się udawać, a większość metod nie jest oznaczona jako wirtualna.
Niedawno miałem podobny problem z HttpRequest i HttpWebResponse. W końcu, rozwiązanie poszedłem było stworzenie prostego otoki „pass-through” dla metod chciałem użyć:
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
to niech mnie kpić przeciwko własnym owijki berło. Niekoniecznie najbardziej elegancka rzecz na świecie, ale bardzo przydatny sposób na wyśmiewanie niektórych mniej "mocowanych" części ramy.
Zanim odejdziesz i zrobisz to, warto sprawdzić, co masz, i zobaczyć, czy istnieje lepsze podejście do testów, które pozwoliłyby uniknąć zawijania klas.
W przypadku HttpWebRequest, HttpApplication i innych często nie ma IMHO.
W celu ustalenia tej owijki w udawanym (używając mojego HttpWebRequest przykład powyżej) wtedy robić rzeczy, jak ten z Min:
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();
Dzięki za info! Trochę refaktoryzowałem, więc większość dodatkowej funkcjonalności znajduje się teraz w zewnętrznej klasie, która może zostać stworzona tylko z wyśmiewaną HttpContextBase zamiast polegania na HttpApplication. –