您将如何通过 MOQ 对 FTPWebRequest 和 FTPWebResponse 进行单元测试。
问问题
1364 次
3 回答
1
你不能用 Moq 模拟FTPWebRequest或FTPWebResponse,因为它只允许你模拟接口或抽象类。当他们编写大部分 System.Net 命名空间时,看起来 MS 并没有考虑可测试性。这就是我从 Moq 搬到 RhinoMocks 的主要原因。
您需要构建自己的 FTPWeb* 对象并将它们传递给您的处理程序。
于 2011-03-30T10:55:27.757 回答
0
使用 Mock 也是不可能的,因为FTPWebResponse
没有暴露构造函数来允许从中派生一些东西。
这是我在类似情况下编写测试的方式。
被测方法:ExceptionContainsFileNotFound(Exception ex)
包含以下逻辑:
if (ex is WebException)
{
var response = (ex as WebException).Response;
if (response is FtpWebResponse)
{
if ((response as FtpWebResponse).StatusCode == FtpFileNotFoundStatus)
{
return true;
}
}
}
为了测试它,我实施了快速技巧。
try
{
var request = WebRequest.Create("ftp://notexistingfptsite/");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.GetResponse();
}
catch (WebException e)
{
// trick :)
classUnderTest.FtpFileNotFoundStatus = FtpStatusCode.Undefined;
var fileNotFoundStatus = classUnderTest.ExceptionContainsFileNotFound(e);
Assert.That(fileNotFoundStatus, Is.True);
}
(当然 FtpFileNotFoundStatus 不会暴露给世界。)
于 2013-01-31T20:09:10.810 回答
0
为此,我使用 Rhino 框架。
即使没有公共构造函数、只读属性等,它也可以处理实例创建。
例子:
var ftpWebResponse = Rhino.Mocks.MockRepository.GenerateStub<FtpWebResponse>();
ftpWebResponse.Stub(f=>f.StatusCode).Return(FtpStatusCode.AccountNeeded);
于 2018-02-28T18:20:34.690 回答