问题。。。
单元测试的最佳方法是什么
字符串响应
和
内容类型
从几种控制器方法?
使用。。。
每个方法返回一个
ActionResult
,其中一些是
ViewResult
响应。我正在使用ASP.NET
MVC 2型
RTM和
最小起订量
.
明确地。。。
我想得到
TextWriter
从
HttpContext.Response
并使其包含来自
行动结果
.
为什么?
一。单元测试内
我想测试一些特定的if内容
做
和
没有
与输出一起存在。
2。通过工作线程运行时
我使用后台工作线程更新远程服务器上的静态内容,此内容是控制器的输出,必须按此方式生成。不建议通过HTTP向同一服务器发出请求,因为有许多1000个文件正在更新。
我看到在这两处都使用了相同的代码
运行时
和via
单元测试
,因为它会非常相似?
绊脚石1
如何正确设置模拟以不需要路由
或者
呼叫
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;
}
我目前对TestMethod的尝试如下:
[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.
}
我的区域、视图和共享文件是:
-
Areas\Coded\Controllers\CodeController.cs
-
Areas\Coded\Views\Coded\CodedJavaScript.aspx
-
Areas\Coded\CodedAreaRegistration.cs
-
Views\Shared\CodedJavaScript.Master
编辑
:编辑为现在包括单元测试和运行时执行。感谢@Darin Dimitrov提到
集成测试
但现在这个问题还有一个运行时元素。
编辑
:在使用来自
MvcIntegrationTestFramework as referenced by alexn
. 使用
AppDomain.CreateDomain
和
SimpleWorkerRequest
要创建新请求,我发现在已经有活动请求的进程中,无法通过此方法创建新请求,原因是
static
使用的值。所以这就排除了这种方法。
可能是同一个问题,但我现在想知道的是
局部视图
可以更直接地作为字符串返回吗?