3

我们刚刚开始使用 ASP.Net MVC Release Candidate,我们之前的测试项目是使用 MVC beta 测试 Ajax 请求。

旧代码看起来像这样:

Mock<HttpRequestBase> request = new Mock<HttpRequestBase>();
Mock<HttpResponseBase> response = new Mock<HttpResponseBase>();
Mock<HttpContextBase> context = new Mock<HttpContextBase>();

context.Expect(c => c.Request).Returns(request.Object);
context.Expect(c => c.Response).Returns(response.Object);

request.Expect(req => req["__MVCASYNCPOST"]).Returns("true");

MyController controller = new MyController();
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
ViewResult result = controller.UpdateStatus() as ViewResult;

然后,对 UpdateStatus 的调用将使用请求对象上的 IsMvcAjaxRequest() 方法来确定要返回给浏览器的内容。

ASP.Net MVC Release Candidate 将 Request.IsMvcAjaxRequest() 更改为 Request.IsAjaxRequest() 的扩展方法意味着我们模拟请求标头的方式更改为:

request.Expect(req => req["X-Requested-With"]).Returns("XMLHttpRequest");

我希望其他人觉得这很有用

4

2 回答 2

1

我知道 Scott Gu 的博客提到了更改,但它没有提供任何代码示例来说明对测试代码的影响或模拟 Ajax 请求需要返回的值。认为这可能会为候选版本中的这种更改提供快速而简单的修复。

于 2009-01-28T17:42:05.687 回答
1

Scott Guthrie在 RC1 上的博客中介绍了这个问题和许多其他问题。查找有关 AJAX 改进的部分。我注意到的另一件事是 UpdateModel 不再需要 FormCollection。我不得不重新编写单元测试来模拟 Request.Form NameValueCollection。不过,生成的代码可能会更好,所以痛苦是值得的。

编辑:另一个问题。如果您有一个使用 ASP.NET MVC Ajax 的现有 MVC 应用程序,您将需要手动更新您的 Javascript 文件,否则它不会将请求识别为 AJAX 请求。旧的 javascript 文件添加了__MVCASYNCPOST表单字段机制,而不是设置X-Requested-WithHTTP 标头。C:\Program Files\Microsoft ASP.NET\ASP.NET MVC RC\Temp\MvcWebApplicationProjectTemplateRC.cs.zip我在-- 在 Scripts 目录中找到了新版本。

于 2009-01-28T16:16:31.397 回答