2009-02-12 10 views
6

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.

Odpowiedz

3

W testach dla MvcContrib plik MvcMockHelps pokazuje, jak to się robi.

+0

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. –

+1

Należy wykonać wywołanie fałszywego żądaniaRequest.Output, a TextWriter i mockedRequest.OutputStream zwracają strumień, taki jak MemoryStream. – Matthew

+0

Tak ... to jest ta część, której nie umiem. Wciąż próbuję różnych rzeczy. –