тестирование пользовательских действий в mvc 2 - PullRequest
5 голосов
/ 16 июня 2011

У меня есть actionresult, который переопределяет Execute (как и вы), и actionresult в основном получает модель, сериализует ее и записывает в ответ через response.write (модель в виде текста).

iveЯ немного осмотрелся, и я не вижу простого способа проверить правильность ответа.Я думаю, что лучший способ - это протестировать конкретный результат и модель собственного действия, вызвать метод execute, а затем кто-нибудь проверить его реакцию контроллера.Единственная проблема в том, как мне получить выходные ответы в виде строки?я где-то читал, что вы не можете получить ответы outputtream в виде текста?Если да, как я могу убедиться, что мой контент записывается в поток ответов?я могу протестировать мой сериализатор, чтобы уменьшить риск, но я хотел бы получить некоторую информацию о переопределении ExecuteResult ...

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);
        }

    } 

1 Ответ

8 голосов
/ 16 июня 2011

Вы можете получить вывод в виде текста, но вам нужно немного проделать дополнительную работу, чтобы все это можно было проверить.

Вам понадобится MVCContrib.TestHelper, чтобы настроить макеты для всех компонентов 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...