Ответ 1
К сожалению, это не так просто сделать, поскольку HttpApplication не поддаётся издевательствам очень легко; нет никакого интерфейса для подделки, и большинство методов не помечены как виртуальные.
Недавно у меня была аналогичная проблема с HttpRequest и HttpWebResponse. В конце концов, решение, к которому я стремился, заключалось в создании прямой "сквозной" оболочки для методов, которые я хотел использовать:
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; }
}
}
и т.д.
Это позволяет мне высмеивать мой собственный интерфейс оболочки. Не обязательно самая элегантная вещь в мире, но очень полезный способ издеваться над некоторыми из менее "макетных" частей рамки.
Прежде чем вы спешите и сделаете это, вам стоит просмотреть, что у вас есть, и посмотреть, есть ли лучший подход к вашим тестам, чтобы избежать необходимости обертывания классов.
В случае HttpWebRequest HttpApplication и др. часто не ИМХО.
Чтобы установить эту оболочку в mock (используя мой пример HttpWebRequest выше), вы затем делаете такие вещи с помощью 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();