Как получить результат из ControllerContext - PullRequest
1 голос
/ 05 июля 2011

Мое действие контроллера возвращает пользовательский ActionResult, который выполняет либо успешный, либо неудачный результат в зависимости от логики проверки.Это происходит в течение ExecuteResult.

Мой вопрос: как я могу проверить результат?

Вот тест на данный момент:

[TestFixture]
public class FormActionResultTests
{
    TestController controller;

    [SetUp]
    public void SetUp()
    {
        ObjectFactory.Initialize(cfg =>
        {
            cfg.For<IFormHandler<TestModel>>().Use<TestModelHandler>();
        });

        controller = new TestControllerBuilder().CreateController<TestController>();
    }

    [Test]
    public void Valid_input_returns_success_result()
    {
        var result = controller.Test(new TestModel { IsValid = true, IsValid2 = true })
            .AssertResultIs<FormActionResult<TestModel>>();

        var context = controller.ControllerContext;

        result.ExecuteResult(context); 
        // how to verify result?

    }
}

public class TestController : Controller
{
    public ActionResult Test(TestModel model) {
        return new FormActionResult<TestModel>(model, this.Content("Success"), View(model));
    }
}

public class TestModel {
    public bool IsValid { get; set; }
    public bool IsValid2 { get; set; }
}

public class TestModelHandler : IFormHandler<TestModel>
{
    public void Handle(TestModel form, IValidationDictionary validationDictionary)
    {

    }
}

Обновление

Вот что у меня получилось в итоге (с помощью NSubstitute):

    [Test]
    public void Valid_input_returns_success_result()
    {
        var result = new FormActionResult<TestModel>(new TestModel { IsValid = true, IsValid2 = true },
            new ContentResult { Content = "Success" }, new ContentResult { Content = "Failed" });

        var sb = new StringBuilder();
        var response = Substitute.For<HttpResponseBase>();
        response.When(x => x.Write(Arg.Any<string>())).Do(ctx => sb.Append(ctx.Arg<string>()));
        var httpContext = Substitute.For<HttpContextBase>();
        httpContext.Response.Returns(response);

        var controllerContext = new ControllerContext(httpContext, new RouteData(), new TestController());

        result.ExecuteResult(controllerContext);

        sb.ToString().ShouldEqual("Success");
    }

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Контроллер должен быть проверен на то, что они возвращают правильный ActionResult в вашем случае, а Успех или Сбой ActionResult должен быть проверен ActionResultTest, и он не имеет никакого отношения к контроллеру.Модульный тест означает одиночный модульный тест, но вы тестируете и контроллер, и ActionResult в одном тесте, что неверно.Чтобы протестировать ActionResult, сначала представьте, что обычно все, что делает ActionResult, записывает результат в HttpResponse.Давайте перепишем ваш код, чтобы использовать Moq для предоставления StringWriter для ControllerContext.HttpContext.HttpResponse.Output

[Test]
    public void Valid_input_returns_success_result()
    {
        var result = controller.Test(new TestModel { IsValid = true, IsValid2 = true })
            .AssertResultIs<FormActionResult<TestModel>>();

        var context = controller.ControllerContext;

        Mock<HttpContextBase> mockHttpContext = new Mock<HttpContextBase>();

        StringWriter actionResultOutput = new StringWriter();

        mockHttpContext.Setup(x => x.Response.Output).Returns(actionResultOutput);


        context.HttpContext = mockHttpContext.Object;

        result.ExecuteResult(context); 
        // how to verify result? Examine actionResultOutput

    }

Все осталось для изучения actionResultOutput.Например, если ваш результат действия предназначен для возврата строки «Успех», когда проверка в порядке, и «Ошибка», если проверка не пройдена, сравните эти строки с actionResultOutput.ToString().Если сгенерированный html вашего представления результатов является более сложным, вы можете использовать HtmlAgilityPack для более глубокого изучения выходных данных

0 голосов
/ 05 июля 2011

Вы должны написать простой модульный тест Test-action, утверждающий возвращаемый результат действия. Вы не должны зависеть от инфраструктуры MVC в своем тесте. Просто создайте новый экземпляр TestController и вызовите метод Test.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...