2011-07-08 41 views
0

我试图让我的控制器单元测试返回一个模拟文件时Request.Files[0]被称为MVC犀牛嘲笑为Request.Files

从这个网站其他职位我已经把:

[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伟大。

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

我没有做过太多的嘲笑之前,所以任何帮助将不胜感激!

回答

1

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

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

添加上述行创建fileMock对象后的代码工作:)

+0

非常感谢堆! – AnonyMouse

0

最简单的方法是通过接口和对象实际调用出来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 Mocks(或任何嘲笑/伪造框架)中可以直接模拟出来