Pregunta

¿Cómo realizaría una prueba unitaria de FTPWebRequest y FTPWebResponse a través de MOQ?

No hay solución correcta

Otros consejos

No se puede burlarse ftpwebrequest o ftpwebresponse con MOQ, porque solo le permite burlarse de las interfaceso clases abstractas.Y no parece que MS estuviera pensando en la prueba cuando escribieron la mayor parte del espacio de nombres de System.net.Esa es la razón principal por la que me alejé de MOQ a Rhinomocks.

Tendrá que construir sus propios objetos FTPWEB * y pasarlos a su manejador.

No es posible con Mock también porque FTPWebResponse no tiene constructores expuestos para permitir que se derive algo de él.

Así es como escribí mi prueba en una situación similar.

Método bajo prueba: ExceptionContainsFileNotFound(Exception ex)contiene la siguiente 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 probarlo implementé un truco 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);
}

(Por supuesto, FtpFileNotFoundStatus no está expuesto al mundo).

para eso uso el marco de rinoceronte.

Puede manejar la creación de instancias incluso si no hay un constructor público, lea solo las propiedades y más.

Ejemplo:

var ftpWebResponse = Rhino.Mocks.MockRepository.GenerateStub<FtpWebResponse>();
ftpWebResponse.Stub(f=>f.StatusCode).Return(FtpStatusCode.AccountNeeded);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top