我的控制器操作返回一个定制的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");
}发布于 2011-07-05 18:49:49
控制器应该被测试,在你的情况下,它们返回正确的ActionResult,ActionResult的成功或失败应该由ActionResultTest来测试,它与控制器无关。单元测试意味着单个单元测试--但是你在同一个测试中同时测试控制器和ActionResult,这是不正确的。要测试ActionResult,首先假设ActionResult所做的一切就是将结果写入HttpResponse。让我们重写代码,使用Moq为ControllerContext.HttpContext.HttpResponse.Output提供StringWriter
[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更深入地检查输出
发布于 2011-07-05 18:49:25
您应该编写一个Test-action的简单单元测试,并对返回的操作结果进行断言。您不应该在测试中依赖MVC框架。只需创建一个新的TestController实例并调用测试方法。
https://stackoverflow.com/questions/6580819
复制相似问题