Pergunta

Como você testaria a unidade FTPWebRequest e FTPWebResponse por meio de MOQ.

Nenhuma solução correta

Outras dicas

Você não pode zombar de ftpwebrequest ou ftpwebresponse com o MOQ, porque só permite que você zomba de interfacesou aulas abstratas.E não se parece com o MS estava pensando em testabilidades quando escreveu a maior parte do namespace System.Net.Essa é a principal razão pela qual eu me mudei do MOQ para rinomocks.

Você precisará criar seus próprios objetos FTPWeb * e passá-los para o manipulador.

Não é possível com Mock também porque FTPWebResponse não possui construtores expostos para permitir que algo seja derivado dele.

Aqui está como escrevi meu teste em situação semelhante.

Método em teste: ExceptionContainsFileNotFound(Exception ex)contém a seguinte lógica:

if (ex is WebException)
{
    var response = (ex as WebException).Response;
    if (response is FtpWebResponse)
    {
        if ((response as FtpWebResponse).StatusCode == FtpFileNotFoundStatus)
        {
            return true;
        }
    }
}

Para testá-lo implementei um truque rápido.

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);
}

(É claro que FtpFileNotFoundStatus não está exposto ao mundo.)

Para isso eu uso o Rhino frameWork.

Ele pode lidar com a criação de instâncias mesmo se não houver um construtor público, propriedades somente leitura e muito mais.

Exemplo:

var ftpWebResponse = Rhino.Mocks.MockRepository.GenerateStub<FtpWebResponse>();
ftpWebResponse.Stub(f=>f.StatusCode).Return(FtpStatusCode.AccountNeeded);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top