gpt4 book ai didi

asp.net - 通过 ExecuteResult 单元测试或运行时 ActionResult 字符串输出响应?

转载 作者:行者123 更新时间:2023-12-04 15:15:40 24 4
gpt4 key购买 nike

问题...

进行单元测试的最佳方法是什么?字符串响应 内容类型 从几个 Controller 方法?

使用...

每个方法返回一个 ActionResult ,其中一些是 ViewResult回应。我正在使用 ASP.NET MVC 2 RTM 和 起订量 .

具体来说...

我想获得TextWriter来自 HttpContext.Response并让它包含来自 ActionResult 的完整字符串响应.

为什么?

1. 在单元测试中

我想测试一些特定的内容 与输出一起存在。

2. 通过工作线程运行时

我使用后台工作线程更新远程服务器上的静态内容,该内容是 Controller 的输出,必须如此生成。通过 HTTP 向同一服务器发出请求是不可取的,因为有很多 1000 个文件需要更新。

我看到在运行时和通过单元测试使用相同的代码,因为它非常相似?

绊脚石1

如何正确设置模拟以不需要路由 调用 RegisterRoutesRegisterAllAreas调用成功,当前在内部深处抛出异常 BuildManagerWrapper::IBuildManager.GetReferencedAssemblies .

示例代码

我的 mock 助手看起来像这样:

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.

}

我的区域、 View 和共享文件是:

- 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.CreateDomainSimpleWorkerRequest要创建新请求,我发现无法在已经有事件请求的进程中通过此方法创建新请求,原因是 static使用的值。所以这排除了这种方法。

可能是同样的问题,但我现在想知道结果是否来自 局部 View 可以更直接地作为字符串返回吗?

最佳答案

您想要实现的不再是单元测试而是集成测试,因为您不再孤立地测试您的应用程序组件,并且有很棒的工具可以让您做到这一点,例如 SeleniumWeb Tests在 Visual Studio 的 Ultimate 版本中。

这些测试的优势在于它们模拟用户请求并覆盖整个应用程序行为。因此,对于给定的用户请求,您可以断言您的应用程序正确响应。这个想法是你编写用户场景,记录它们,然后你可以自动执行这些测试,以断言你的应用程序按照指定的方式响应。

关于asp.net - 通过 ExecuteResult 单元测试或运行时 ActionResult 字符串输出响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4216349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com