2012-03-01 15 views
5

Tengo algunas pruebas de unidad que estoy escribiendo para una aplicación WPF, y por más que trate de evitarlo, tengo un código bajo prueba que crea una instancia de una vista. Tan pronto como se crea una instancia de la vista, se evalúan todas las extensiones de marcas, estilos, etc. Para resolver este He creado un maniquí Aplicación y registrado ninguna recursos necesarios cuando se inicializa el conjunto de prueba:Pruebas unitarias Aplicación WPF con el paquete siteoforigin Uri

[TestClass] 
public class AssemblyInitialize 
{ 
    [AssemblyInitialize] 
    public static void SetupTestAssembly(TestContext context) 
    { 
     if (Application.Current == null) 
      new Application(); 

     var resources = new List<string> 
      { 
       "pack://application:,,,/AssemblyName;component/ResourceDictionary.xaml" 
      }; 

     foreach(var resource in resources) 
     { 
      var uri = new Uri(resource); 
      var dictionary = new ResourceDictionary { Source = uri }; 
      Application.Current.Resources.MergedDictionaries.Add(dictionary); 
     } 
    } 
} 

He usado este enfoque en el pasado, y funciona bien.

Me he encontrado con un pequeño inconveniente con este enfoque. Tengo algunos recursos que usan paquete: // siteoforigin: en el paquete Uri, y cuando las pruebas ejemplifican esta vista, aparece un error acerca de no poder resolver el archivo.

El XAML:

<ResourceDictionary 
    xmlns="..."> 

    <ImageBrush 
     x:Key="ResourceName" 
     ImageSource="pack://siteoforigin:,,,/Resources/image.png" 
     /> 
</ResourceDictionary> 

mensaje de error:

Could not find a part of the path 'C:\\Solution\\TestResults\\Workspace_2012-03-01 14_54_29\\Resources\\image.png' 

He añadido el directorio de recursos como un elemento de despliegue, y he confirmado que la imagen es la Directorio de salida TestRun. Parece que el dominio de aplicación está funcionando por encima de una carpeta donde la ubicación de mis conjuntos para prueba, ya que el archivo se encuentra realmente en:

c: \ Solution \ Resultado de la Pruebas \ Workspace_2012-03-01 14_54_29 \ fuera \ Resources \ image.png

¿Alguna sugerencia sobre cómo puedo hacer que la aplicación WPF use el directorio Out como su carpeta principal?

+0

¿Funciona forzar manualmente la carpeta base de su Appdomain? 'AppDomain.CurrentDomain.SetData (" APPBASE "," FolderNameHere ");' Parece que hay una manera mejor, pero mi memoria me está fallando. Esto puede ser suficiente (tm). – ianschol

+0

Ha estado investigando esto durante horas. AppDomain.CurrentDomain.BaseDirectory devuelve la carpeta Out. – bryanbcook

Respuesta

3

Esto es debido a que el AppDomain.BaseDirectory que está configurado por su corredor de prueba no tiene un '/' carácter final, esto hace que el código que resuelve siteoforigin caminos de perder el último directorio de la ruta.

Puede comprobar esto mirando el resultado del siguiente código cuando se ejecuta normalmente o en pruebas.

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); 

Esto ha sido recientemente fixed en NUnit (incluido en 2.6), pero todavía puede ser un problema con otros corredores de la prueba.

Si le interesa este es el equivalente a lo que el código está haciendo siteoforigin:

new Uri(new Uri(baseDirectory), "some/relative/path.jpg").LocalPath 

intentar eso con y sin una barra diagonal en baseDirectory.

+0

Sí, la raya al final es la culpable. Descubrí esto poco después de la publicación y no he vuelto para agregar mis hallazgos, pero de todos modos aceptaré su respuesta.De hecho, estoy usando MSTest en 2010, que tampoco pone la barra al final. – bryanbcook

+0

Gracias, he modificado para eliminar la suposición acerca de NUnit. –