Модульное тестирование FTPWebRequest / FTpWebResponse - PullRequest
2 голосов
/ 30 марта 2011

Как бы вы провели модульное тестирование FTPWebRequest и FTPWebResponse через MOQ.

Ответы [ 3 ]

1 голос
/ 30 марта 2011

Вы не можете макетировать FTPWebRequest или FTPWebResponse с Moq, потому что он позволяет только симулировать интерфейсы или абстрактные классы. И похоже, что MS не думала о тестируемости, когда писала большую часть пространства имен System.Net. Это основная причина, по которой я перешел из Moq в RhinoMocks.

Вам нужно будет создать свои собственные объекты FTPWeb * и передать их вашему обработчику.

0 голосов
/ 28 февраля 2018

Для этого я использую Rhino frameWork.

Может обрабатывать создание экземпляров, даже если нет открытого конструктора, свойств только для чтения и т. Д.

Пример:

var ftpWebResponse = Rhino.Mocks.MockRepository.GenerateStub<FtpWebResponse>();
ftpWebResponse.Stub(f=>f.StatusCode).Return(FtpStatusCode.AccountNeeded);
0 голосов
/ 01 февраля 2013

Невозможно с 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 не выставляется миру.)

...