Я работаю над приложением ASP.NET MVC и пытаюсь написать некоторые модульные тесты для действий контроллера, некоторые из которых манипулируют свойствами в HttpContext, такими как Session, Request.Cookies, Response.Cookies и т. Д. У меня возникли проблемы с выяснением, как «Упорядочить, Действовать, Утвердить» ... Я вижу, как устроить и Утвердить ... но у меня возникли проблемы с выяснением, как «Действовать» на свойства макета HttpContextBase, когда все из его свойств есть только добытчики. Я не могу установить что-либо в моём смоделированном контексте в действиях моего контроллера ... так что это не кажется очень полезным. Я довольно новичок в издевательстве, поэтому я уверен, что есть кое-что, чего мне не хватает, но мне кажется логичным, что я должен быть в состоянии создать фиктивный объект, который я могу использовать в контексте тестирования действий контроллера, где я может на самом деле установить значения свойств, а затем утверждать, что они все равно, что я им установил, или что-то в этом роде. Чего мне не хватает?
public static HttpContextBase GetMockHttpContext()
{
var requestCookies = new Mock<HttpCookieCollection>();
var request = new Mock<HttpRequestBase>();
request.Setup(r => r.Cookies).Returns(requestCookies.Object);
request.Setup(r => r.Url).Returns(new Uri("http://example.org"));
var responseCookies = new Mock<HttpCookieCollection>();
var response = new Mock<HttpResponseBase>();
response.Setup(r => r.Cookies).Returns(responseCookies.Object);
var context = new Mock<HttpContextBase>();
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(new Mock<HttpSessionStateBase>().Object);
context.Setup(ctx => ctx.Server).Returns(new Mock<HttpServerUtilityBase>().Object);
context.Setup(ctx => ctx.User).Returns(GetMockMembershipUser());
context.Setup(ctx => ctx.User.Identity).Returns(context.Object.User.Identity);
context.Setup(ctx => ctx.Response.Output).Returns(new StringWriter());
return context.Object;
}