我试图让我的控制器在单元测试中返回一个模拟文件时,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/伪造框架)