单元测试——Request.Files的MVC Rhino模拟



我试图让我的控制器在单元测试中返回一个模拟文件时,Request.Files[0]被称为

我把这个网站上的其他帖子放在一起:

[TestMethod]
        public void CreateFileInDatabase()
        {
            var repository = new MocRepository();
            var controller = GetController(repository);
            HttpContextBase mockHttpContext = MockRepository.GenerateMock<HttpContextBase>();
            HttpRequestBase mockRequest = MockRepository.GenerateMock<HttpRequestBase>();
            mockHttpContext.Stub(x => x.Request).Return(mockRequest);
            mockRequest.Stub(x => x.HttpMethod).Return("GET");
            var filesMock = MockRepository.GenerateMock<HttpFileCollectionBase>();
            var fileMock = MockRepository.GenerateMock<HttpPostedFileBase>();
            filesMock.Stub(x => x.Count).Return(1);
            mockRequest.Stub(x => x.Files).Return(filesMock);
            var t = mockHttpContext.Request;
            var automobile = new Automobile{ automobileNumber = "1234" };
            controller.ControllerContext = new ControllerContext(mockHttpContext, new RouteData(), controller);
            controller.Create(automobile);
        }

当我在测试期间在控制器中并调用Request.Files时,我得到了filesMock great.

然而,我希望能够调用Request.Files[0]并获得一个模拟文件,我可以将其作为参数传递给方法。

我以前没有做过很多嘲笑,所以任何帮助都会很感激!

您的filesMock对象是一个模拟对象,因此它不知道如何解析Files[0]。如果有人请求第一个文件,您需要告诉它返回什么:

filesMock.Stub(x => x[0]).Return(fileMock);

在创建fileMock对象之后添加上面的行,代码就可以工作了:)

最简单的方法是通过实际调用Request.Files[0]的接口和对象在Request.Files[0]上添加抽象

注意:我实际上不确定Request.Files[0]的数据类型是什么,只是以IFile为例。

public interface IFileRetriever
{
    IFile GetFile();
}
public class FileRetriever
{
    public IFile GetFile()
    {
        return Request.Files[0];
    }
}

显然适合您的用例的接口和实际实现,它可能不是上面所说的…

在当前调用Request.Files[0]的类中,只需将IFileRetriever作为依赖项,这可以直接模拟出Rhino mock(或任何mock/伪造框架)

最新更新