2014-10-09 39 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);