如何在MVC单元测试类中模拟Request.Files[]?

6
我想在MVC单元测试中测试一个控制器方法。 为了测试我的控制器方法,我需要一个长度为一的Request.Files[]集合。 由于我在由控制器方法呈现的视图上使用了文件上传控件,所以我想模拟Request.Files[]。 请问有人能建议我如何在单元测试中模拟request.file集合吗?
谢谢, 卡皮尔
2个回答

10
你没有提到你使用的模拟框架是什么,但以下是如何使用Rhino Mocks进行操作:

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(Request.Files.Count);
    }
}

单元测试:

[TestMethod]
public void SomeTest()
{
    // arrange
    var controller = new HomeController();
    var context = MockRepository.GenerateStub<HttpContextBase>();
    var request = MockRepository.GenerateStub<HttpRequestBase>();
    var files = MockRepository.GenerateStub<HttpFileCollectionBase>();
    context.Stub(x => x.Request).Return(request);
    files.Stub(x => x.Count).Return(5);
    request.Stub(x => x.Files).Return(files);
    controller.ControllerContext = new ControllerContext(context, new RouteData(), controller);


    // act
    var actual = controller.Index();

    // assert
    Assert.IsInstanceOfType(actual, typeof(ViewResult));
    var viewResult = actual as ViewResult;
    Assert.IsInstanceOfType(viewResult.ViewData.Model, typeof(int));
    Assert.AreEqual(5, viewResult.ViewData.Model);
}

备注:使用MVCContrib.TestHelper可以极大地简化此测试,尤其是上下文模拟部分和断言部分:

[TestMethod]
public void SomeTest()
{
    // arrange
    var sut = new HomeController();
    InitializeController(sut);
    Files["test.txt"] = MockRepository.GenerateStub<HttpPostedFileBase>();

    // act
    var actual = sut.Index();

    // assert
    actual
        .AssertViewRendered()
        .WithViewData<int>()
        .ShouldBe(1);
}

2
谢谢Darin。我正在使用开源模拟框架“Moq”。 - Jaqen H'ghar

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接