【问题标题】:Using Request.Files.Count with TestControllerBuilder from MvcContrib?将 Request.Files.Count 与 MvcContrib 中的 TestControllerBuilder 一起使用?
【发布时间】:2009-07-29 21:59:57
【问题描述】:

我在 ASP.NET MVC 中有一个控制器操作来处理上传的文件。但是,使用 MvcContrib 的 TestControllerBuilder 时似乎无法调用 Request.Files.Count

我知道我可以通过抽象 Request.Files 来解决这个问题。我的问题是:

  1. 使用TestControllerBuilder时,是不是真的没有直接调用Request.Files.Count的方法?还是我做错了什么?
  2. 在使用 Rhino Mocks 使用 TestControllerBuilder 时,有没有办法将对 Request.Files.Count 的调用存根?
  3. 你认为我应该向 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


    【解决方案1】:

    我在 Github 上 submitted a patch 到 MvcContrib mantainers,但是更改非常简单,问题是 HttpFileCollectionBase 没有实现 Count() 和 this[int index] 方法,因此它们必须被 MvcContrib 中的 WriteableHttpFileCollection 覆盖.

    为了完整起见,我把代码贴在这里,必须添加到 WriteableHttpFileCollection 类中:

    public override HttpPostedFileBase this[int index]
    {
        get { return files[AllKeys[index]]; }
    }
    
    public override int Count
    {
        get { return files.Count; }
    }
    

    【讨论】:

      【解决方案2】:

      我已经使用这种方法来解决问题。

      设置测试: string fileName = "Test 1.pdf"; FileStream 流 = File.OpenRead("log4net.config"); MockRepository mock = new MockRepository();

              builder.Files[fileName] = mock.CreateMock<HttpPostedFileBase>();
              using (mock.Record())
              {
                  Expect.Call(builder.Files[fileName].FileName)
                        .Return(fileName);
                  Expect.Call(builder.Files[fileName].ContentType)
                        .Return(contentType);
                  Expect.Call(builder.Files[fileName].ContentLength)
                        .Return(Convert.ToInt32(stream.Length.ToString()));
                  Expect.Call(builder.Files[fileName].InputStream)
                        .Return(stream);
              }
      

      使用模拟:

              foreach(string key in Request.Files.AllKeys)
              {
                  int lenght = Request.Files[key].ContentLength;
                  if (lenght > 0)
                  {
                      Document document = new Document();
                      string fileName = Request.Files[key].FileName;
                      byte[] content= new byte[Convert.ToInt32(lenght)];
                      Request.Files[key].InputStream.Read(content, 0, content.Length);
                      document.SetContent(content);
                      document.MimeType = Request.Files[key].ContentType;
                      // do whatever you want...
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        相关资源
        最近更新 更多