2014-10-09 59 views
1

我試圖僞造一個集成測試FtpWebRequest.GetResponse(),但不使用服務器。我一直在試圖做的是簡單地返回一個假的FtpWebResponse,但是,你不能訪問FtpWebResponse的構造函數,因爲它是內部的。如何創建一個假FtpWebResponse

這裏是我的代碼:

生產代碼:

  using (FtpWebResponse response = (FtpWebResponse) ftpWebRequest.GetResponse()) 
      { 
       ftpResponse = new FtpResponse(response.StatusDescription, false); 
      } 

測試假的,我嘗試使用返回假FtpWebResponse:

  ShimFtpWebRequest.AllInstances.GetResponse = request => 
      { 
       FtpWebResponse ftpWebResponse= new FtpWebResponse(/*parameters*/); // not allowed because it is internal 
       ftpWebResponse.StatusDescription="blah blah blah"; 
       return ftpWebResponse; 
      }; 

最後,所有我想要的要做的是在我的測試中返回假的ftpWebResponse來斷言。有任何想法嗎? 謝謝

回答

0

找到了答案。如果你Shim的FtpWebResponse,它將允許一個構造函數:

 FtpResponse response; 

     using (ShimsContext.Create()) 
     { 
      ShimFtpWebRequest.AllInstances.GetResponse = request => new ShimFtpWebResponse(); 
      ShimFtpWebResponse.AllInstances.StatusDescriptionGet = getDescritpion => "226 Transfer complete."; 
      _ftpConnection.Put(_fileContent); 
      response = new FtpResponse("226 Transfer complete.", false); 
     } 
     Assert.AreEqual(response.Message, "226 Transfer complete."); 
     Assert.IsFalse(response.HasError); 
+0

應當注意的是,這個答案需要Visual Studio高級專業版或更高版本。還有一種叫做Prig的替代方案,我沒有用過,可能會有所幫助,否則這應該被認爲是一種*高級解決方案*,它不適用於所有人。 – Maffelu 2015-08-31 11:59:03

0

犀牛框架可以做到這一點。它可以通過的NuGet添加:

例子:

var ftpWebResponse = Rhino.Mocks.MockRepository.GenerateStub<FtpWebResponse>(); 
ftpWebResponse.Stub(f=>f.StatusCode).Return(FtpStatusCode.AccountNeeded);