Dea*_*lor 6 asp.net asp.net-mvc unit-testing actionresult asp.net-mvc-2
从几种Controller方法单元测试字符串响应和内容类型的最佳方法是什么?
每个方法返回一个ActionResult,其中一些是ViewResult响应.我正在使用ASP.NET MVC 2 RTM和Moq.
我想获取TextWriterfrom HttpContext.Response并让它包含来自的完整字符串响应ActionResult.
我想测试一些特定的内容是否与输出不存在.
我使用后台工作线程来更新远程服务器上的静态内容,这个内容是控制器的输出,必须这样生成.不建议通过HTTP向同一服务器发出请求,因为有许多1000个文件已更新.
我看到在运行时和单元测试中使用相同的代码,因为它非常相似?
如何正确设置模拟不需要路由或调用RegisterRoutes并使RegisterAllAreas调用成功,目前在内部引发异常BuildManagerWrapper::IBuildManager.GetReferencedAssemblies.
public static HttpContextBase FakeHttpContext()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
var writer = new StringWriter();
var form = new NameValueCollection();
var queryString = new NameValueCollection();
request.Setup(r => r.Form).Returns(form);
request.Setup(r => r.QueryString).Returns(queryString);
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session.Object);
context.Setup(ctx => ctx.Server).Returns(server.Object);
context.Setup(ctx => ctx.Response.Output).Returns(writer);
return context.Object;
}
public static void SetFakeControllerContext(this Controller controller)
{
var httpContext = FakeHttpContext();
var routeData = new RouteData();
var routeData = RouteTable.Routes.GetRouteData(httpContext);
ControllerContext context = new ControllerContext(new RequestContext(httpContext, routeData), controller);
controller.ControllerContext = context;
}
Run Code Online (Sandbox Code Playgroud)
[TestMethod]
public void CodedJavaScriptAction_Should_Return_JavaScript_Response()
{
// Arrange
var controller = new CodedController();
controller.SetFakeControllerContext();
// Act
var result = controller.CodedJavaScript(); // Response is made up as a ViewResult containing JavaScript.
var controllerContext = controller.ControllerContext;
var routeData = controllerContext.RouteData;
routeData.DataTokens.Add("area", "Coded");
routeData.Values.Add("area", "Coded");
routeData.Values.Add("controller", "Coded");
routeData.Values.Add("action", "CodedJavaScript");
var response = controllerContext.HttpContext.Response;
response.Buffer = true;
var vr = result as ViewResult;
vr.MasterName = "CodedJavaScript";
result.ExecuteResult(controllerContext);
// Assert
var s = response.Output.ToString();
Assert.AreEqual("text/javascript", response.ContentType);
Assert.IsTrue(s.Length > 0);
// @todo: Further tests to be added here.
}
Run Code Online (Sandbox Code Playgroud)
- Areas\Coded\Controllers\CodeController.cs
- Areas\Coded\Views\Coded\CodedJavaScript.aspx
- Areas\Coded\CodedAreaRegistration.cs
-Views\Shared\CodedJavaScript.Master
编辑:编辑到现在包括单元测试和运行时执行.感谢@Darin Dimitrov提到集成测试,但现在这个问题还有一个运行时元素.
编辑:经过一些测试和审查使用来自alexn引用的MvcIntegrationTestFramework的一些源代码 .使用AppDomain.CreateDomain和SimpleWorkerRequest创建新请求时,我发现由于使用了值,因此无法通过此方法在已有活动请求的进程中创建新请求static.所以这就规定了这种方法.
可能是同样的问题,但我现在想知道部分视图的结果是否可以更直接地作为字符串返回?
| 归档时间: |
|
| 查看次数: |
2907 次 |
| 最近记录: |