Używam klasy MvcMockHelpers znaleźć na Hanselman's blog do przekazywania w wyszydzony HttpContext. Rozszerzyliśmy go nieco, dodając potrzebne nam dane uwierzytelniające i większość z nich była świetna.Kpiny z HttpContext Response.Output z Moq
Problem, który mamy, polega na tym, że kontekst, który przekazujemy kontrolerowi ma wartość null w HttpContext.Response.Output, co powoduje zgłaszanie pewnych wyjątków. Nie jestem pewien, co dodać, aby to zadziałało.
Oto istniejące FakeHttpConext() metoda:
public static HttpContextBase FakeHttpContext()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
// Our identity additions ...
var user = new Mock<IPrincipal>();
OurIdentity identity = (OurIdentity)Thread.CurrentPrincipal.Identity;
context.Expect(ctx => ctx.Request).Returns(request.Object);
context.Expect(ctx => ctx.Response).Returns(response.Object);
context.Expect(ctx => ctx.Session).Returns(session.Object);
context.Expect(ctx => ctx.Server).Returns(server.Object);
context.Expect(ctx => ctx.User).Returns(user.Object);
context.Expect(ctx => ctx.User.Identity).Returns(identity);
return context.Object;
}
Oto metoda wybucha (który jest częścią XmlResult projektu MVC contrib za):
public override void ExecuteResult(ControllerContext context)
{
if (_objectToSerialize != null)
{
var xs = new XmlSerializer(_objectToSerialize.GetType());
context.HttpContext.Response.ContentType = "text/xml";
xs.Serialize(context.HttpContext.Response.Output, _objectToSerialize);
}
}
Co muszę dodać w metodzie FakeHttpContext, aby zapobiec wyjątkowi zerowemu, gdy odwołuje się kontekst.HttpContext.Response.Output?
Wyjaśnienie: Rozwiązanie, którego szukam, musi zostać wykonane w Moq, a nie w Rhino. Wspomniałem Moq w tytule pytania, ale zaniedbałem ten organ. Przepraszamy za jakiekolwiek zamieszanie.
Rozdzielczość dodawaniu dwie linie kodu metodą FakeHttpContext():
var writer = new StringWriter();
context.Expect(ctx => ctx.Response.Output).Returns(writer);
Zapobiega zerowej wyjątku. Nie jestem pewien, czy jest to dobra odpowiedź długoterminowa, ale działa na razie.
Projekt MVC Contrib wykorzystuje RhinoMocks, a nie Moq. Mogę sprawić, żeby test jednostkowy zadziałał za pomocą Rhino, ale Rhino nie jest tym, na czym nasze biuro się standaryzowało. –
Należy wykonać wywołanie fałszywego żądaniaRequest.Output, a TextWriter i mockedRequest.OutputStream zwracają strumień, taki jak MemoryStream. – Matthew
Tak ... to jest ta część, której nie umiem. Wciąż próbuję różnych rzeczy. –