Testing custom actionresult in mvc 2

I have an actionresult that overrides Execute (like you), and the actionresult basically gets the model, serializes it and writes it back in response via response.write (model as text).

ive did some looking around, and I don't see an easy way to verify the answer correctly. I think the best way is to check the instance of the custom actionresult and model, call the execute method, and then somehome to check the controller response. The only problem is how to get reponses output as a string? I read somewhere that you can’t get the response stream as text? if so, how can I verify that my content is being written to the response stream? I can check my serializer to reduce the risk, but id would like some coverage over ExecuteResult overrides ...

public class CustomResult: ActionResult
    {

        private readonly object _contentModel;
        private readonly ContentType _defaultContentType;

        public CustomResult(object contentModel, ContentType defaultContentType)
        {
            _contentModel = contentModel;
            _defaultContentType = defaultContentType;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            context.HttpContext.Response.Write(serialized model);
        }

    } 
+5
source share
1 answer

, , .

MVCContrib.TestHelper, mocks MVC. , , :

public class CustomTestControllerBuilder : TestControllerBuilder
{

    public CustomTestControllerBuilder()
    {
        var httpContext = new Moq.Mock<HttpContextBase>();
        var request = new Moq.Mock<HttpRequestBase>();
        var response = new Moq.Mock<HttpResponseBase>();
        var server = new Moq.Mock<HttpServerUtilityBase>();
        var _cache = HttpRuntime.Cache;

        httpContext.Setup(x=> x.Request).Returns(request.Object);
        httpContext.Setup(x => x.Response).Returns(response.Object);
        httpContext.Setup(x => x.Session).Returns(Session);
        httpContext.Setup(x => x.Server).Returns(server.Object);
        httpContext.Setup(x => x.Cache).Returns(_cache);


        var items = new Dictionary<object, object>();
        httpContext.Setup(x => x.Items).Returns(items);


        QueryString = new NameValueCollection();
        request.Setup(x => x.QueryString).Returns(QueryString);

        Form = new NameValueCollection();
        request.Setup(x => x.Form).Returns(Form);

        request.Setup(x => x.AcceptTypes).Returns((Func<string[]>)(() => AcceptTypes));

        var files = new WriteableHttpFileCollection();
        Files = files;
        request.Setup(x => x.Files).Returns(files);

        Func<NameValueCollection> paramsFunc = () => new NameValueCollection { QueryString, Form };
        request.Setup(x => x.Params).Returns(paramsFunc);

        request.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(
                (Func<string>)(() => AppRelativeCurrentExecutionFilePath));
        request.Setup(x => x.ApplicationPath).Returns((Func<string>)(() => ApplicationPath));
        request.Setup(x => x.PathInfo).Returns((Func<string>)(() => PathInfo));
        request.Setup(x => x.RawUrl).Returns((Func<string>)(() => RawUrl));
        response.SetupProperty(x => x.Status);
        httpContext.SetupProperty(x=>x.User);

        var ms = new MemoryStream(65536);
        var sw = new StreamWriter(ms);
        response.SetupGet(x=>x.Output).Returns(sw);
        response.SetupGet(x => x.OutputStream).Returns(ms);

        response.Setup(x => x.Write(It.IsAny<string>())).Callback((string s) => { sw.Write(s); });
        response.Setup(x => x.Write(It.IsAny<char>())).Callback((char s) => { sw.Write(s); });
        response.Setup(x => x.Write(It.IsAny<object>())).Callback((object s) => { sw.Write(s); });

        //_mocks.Replay(HttpContext);
        //_mocks.Replay(request);
        //_mocks.Replay(response);

        TempDataDictionary = new TempDataDictionary();


        HttpContext = httpContext.Object;
    }

}
}

, OutputStream MemoryStream, -. , , :

 Result.ExecuteResult(c.ControllerContext);
 var ms = (MemoryStream)c.HttpContext.Response.OutputStream;
 c.HttpContext.Response.Output.Flush();
 ResultHtml = new UTF8Encoding().GetString(ms.GetBuffer());
+8

All Articles