【发布时间】:2009-07-29 21:59:57
【问题描述】:
我在 ASP.NET MVC 中有一个控制器操作来处理上传的文件。但是,使用 MvcContrib 的 TestControllerBuilder 时似乎无法调用 Request.Files.Count。
我知道我可以通过抽象 Request.Files 来解决这个问题。我的问题是:
- 使用
TestControllerBuilder时,是不是真的没有直接调用Request.Files.Count的方法?还是我做错了什么? - 在使用 Rhino Mocks 使用
TestControllerBuilder时,有没有办法将对Request.Files.Count的调用存根? - 你认为我应该向 MvcContrib 提交处理
Request.Files.Count的请求或补丁吗?
示例代码:
我想确保Request.Files 集合中至少有一个文件,因此我的操作中有以下条件:
public class MyController : Controller {
public ActionResult Upload() {
if (Request.Files == null || Request.Files.Count == 0)
ViewData.ModelState.AddModelError("File", "Please upload a file");
// do stuff
return View();
}
}
我正在使用来自 MvcContrib 的 TestControllerBuilder 为我的控制器测试创建测试替身。但是,对Request.Files.Count 的调用似乎总是抛出异常。例如,运行以下 NUnit 测试会在调用 controller.Upload() 期间在调用 Request.Files.Count 时抛出 NotImplementedException:
[Test]
public void Upload_should_return_default_view_given_one_file() {
MyController controller = new MyController();
TestControllerBuilder controllerBuilder = new TestControllerBuilder();
controllerBuilder.InitializeController(controller);
controllerBuilder.Files["file"] =
MockRepository.GenerateStub<HttpPostedFileBase>();
var result = controller.Upload() as ViewResult;
Assert.That(result.ViewData.ModelState.IsValid, Is.True);
result.AssertViewRendered().ForView(string.Empty);
}
我也尝试过对Request.Files.Count 的调用存根,但无济于事(我正在使用Rhino Mocks)。以下都不起作用(即使我将controller 和/或controllerBuilder 更改为存根):
controllerBuilder.Stub(cb => cb.HttpContext.Request.Files.Count).Return(1);
controller.Stub(c => c.Request.Files.Count).Return(1);
谢谢
【问题讨论】:
标签: asp.net-mvc unit-testing mvccontrib