1

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

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

  1. Request.Files.Count使用时确实没有直接的调用方式TestControllerBuilder吗?还是我做错了什么?
  2. 有没有办法Request.Files.CountTestControllerBuilder使用 Rhino Mocks 时将调用存根?
  3. 你认为我应该向Request.Files.CountMvcContrib 提交处理请求或补丁吗?

示例代码:

我想确保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();
    }
}

我正在使用TestControllerBuilderMvcContrib 为我的控制器测试创建测试替身。但是,调用Request.Files.Count似乎总是抛出异常。例如,运行以下 NUnit 测试会NotImplementedException在调用 to 期间controller.Upload()抛出a Request.Files.Count

[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);

谢谢

4

2 回答 2

1

我在 Github 上向 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; }
}
于 2010-01-27T14:35:23.997 回答
0

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

设置测试: 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...
            }
        }
于 2009-10-07T19:23:11.023 回答