首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从ControllerContext中获取结果

如何从ControllerContext中获取结果
EN

Stack Overflow用户
提问于 2011-07-05 17:55:40
回答 2查看 3.1K关注 0票数 1

我的控制器操作返回一个定制的ActionResult,它根据一些验证逻辑执行成功或失败的结果。这发生在ExecuteResult中。

我的问题是,我如何检查结果?

以下是目前为止的测试结果:

代码语言:javascript
复制
[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):

代码语言:javascript
复制
    [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");
    }
EN

回答 2

Stack Overflow用户

发布于 2011-07-05 18:49:49

控制器应该被测试,在你的情况下,它们返回正确的ActionResult,ActionResult的成功或失败应该由ActionResultTest来测试,它与控制器无关。单元测试意味着单个单元测试--但是你在同一个测试中同时测试控制器和ActionResult,这是不正确的。要测试ActionResult,首先假设ActionResult所做的一切就是将结果写入HttpResponse。让我们重写代码,使用MoqControllerContext.HttpContext.HttpResponse.Output提供StringWriter

代码语言:javascript
复制
[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了。例如,如果您的操作结果设计为在验证正常时返回字符串"Success“,在验证失败时返回"Error”,则将这些字符串与actionResultOutput.ToString()进行比较。如果结果视图生成的html比较复杂,可以使用HtmlAgilityPack更深入地检查输出

票数 1
EN

Stack Overflow用户

发布于 2011-07-05 18:49:25

您应该编写一个Test-action的简单单元测试,并对返回的操作结果进行断言。您不应该在测试中依赖MVC框架。只需创建一个新的TestController实例并调用测试方法。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6580819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档