Модульное тестирование FTPWebRequest/FTpWebResponse
Как бы вы тестировали модули FTPWebRequest и FTPWebResponse через MOQ.
3 ответа
Вы не можете макетировать FTPWebRequest или FTPWebResponse с Moq, потому что он позволяет только симулировать интерфейсы или абстрактные классы. И похоже, что MS не думала о тестируемости, когда писала большую часть пространства имен System.Net. Это основная причина, по которой я перешел из Moq в RhinoMocks.
Вам нужно будет создать свои собственные объекты FTPWeb* и передать их вашему обработчику.
Для этого я использую Rhino frameWork.
Он может обрабатывать создание экземпляров, даже если нет открытого конструктора, свойств только для чтения и многого другого.
Пример:
var ftpWebResponse = Rhino.Mocks.MockRepository.GenerateStub<FtpWebResponse>();
ftpWebResponse.Stub(f=>f.StatusCode).Return(FtpStatusCode.AccountNeeded);
Не возможно с 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 не открывается миру.)