2011-07-08 40 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(或任何嘲笑/僞造框架)中可以直接模擬出來