Pregunta

En primer lugar, soy consciente de que esta pregunta está peligrosamente cerca de: Cómo MapPath en una unidad de prueba en C #

Estoy esperando sin embargo, que no tiene una solución diferente. Mi problema siguiente:

En mi código que tengo un objeto que debe ser validado. Voy a crear pruebas unitarias para cada método de validación para asegurarse de que está validando correctamente. Estoy creando los datos simulados y cargarlo en el objeto, luego validarlo. El problema es que dentro de la validación, cuando se produce un error, se le asigna un código de error. Este código de error se utiliza para recopilar información sobre el error desde un archivo XML utilizando Server.MapPath. Sin embargo, cuando se trata de obtener el archivo XML, se produce una excepción que significa que el archivo no se puede encontrar.

Desde MapPath está en mi código de validación, y no mi prueba de unidad, ¿cómo hago para que mi unidad de prueba para reconocer la trayectoria? ¿Esta pregunta tiene sentido?

Error de Línea (En mi código de validación no mi prueba de unidad):

XDocument xdoc = XDocument.Load(HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml"));

simplificado: La Prueba de la unidad llama a un método en mi programa que llama Server.MapPath que a su vez produce un error

.
¿Fue útil?

Solución

Me abstracta a cabo el "proveedor de nombre de archivo" en una clase que simplemente devuelve un lugar, entonces usted puede burlarse mucho, mucho más fácil.

public class PathProvider
{
    public virtual string GetPath()
    {
        return HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml");
    }
}

A continuación, puede utilizar la clase PathProvider directamente ...

PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

o modelos a que en sus pruebas:

PathProvider pathProvider = new MockPathProvider(); // using a mocking framework
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

Otros consejos

Después de algunas google rigurosa y algo de ayuda de un colega que se nos ocurrió una solución simple ya está integrado en .NET

Por encima de las pruebas de unidad que accede el proceso de validación, añadí:

 [TestMethod()]
 [HostType("ASP.NET")]
 [UrlToTest("http://localhost:###/upload_file.aspx")]
 [AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]

Esto funciona perfectamente. Básicamente, cuando la prueba se llama, se carga la dirección URL con la prueba de la unidad especificada en la carga de la página. Dado que es un sitio web que ahora se llama la prueba de la unidad, la validación tendrá acceso a Server.MapPath. Esta solución puede no funcionar para todos, pero era perfecto para esto. Gracias a todo lo aportado.

Trate de usar Rhino Mocks o un marco de burla alternativa a burlarse de la HttpContext (u otros objetos dependientes) O usted podría escribir sus propios objetos simulados. O escribir una clase MapPathWrapper, heredar de una clase MapPathWrapperBase para su entorno real, a continuación, en para las pruebas unitarias crear un objeto MockMapPathWrapper.

Debe haber un montón de ejemplos para burlarse de SO.

Aquí hay una pregunté:

Cómo utilizar burla de Rhino para burlarse de un HttpContext .Application

Actualizar Sólo tengo experiencia haciendo esto con el Asp.Net MVC, con formularios web que ImageIN sería mucho más difícil debido a la falta de una clase HttpContextBase.

Me extraer métodos que aceptan sus dependencias como argumentos:

public void Validate(HttpContext context)
{
    ValidatePath(context.Server.MapPath("App_Data/ErrorCodes.xml"));
}

public void ValidatePath(string path)
{
    XDocument xdoc = XDocument.Load(path);
    ValidateDocument(xdoc);
}

public void ValidateDocument(XDocument xdoc)
{
    // Original code
}

A continuación, puede probar los diferentes métodos de forma independiente. Por ejemplo, las pruebas de cómo ValidatePath() maneja un archivo que falta.

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