2010-09-14 13 views
14

Así que tengo esta pequeña y bonita solución MVVM, y las cosas funcionan muy bien. Tengo un modelo de vista para una barra de encabezado que ajusta el icono según el estado de la aplicación, etc. He realizado pruebas de aceptación, el modelo de vista funciona muy bien.Urls de paquete y pruebas unitarias. ¿Problema con mi entorno?

Así que quiero unidad de prueba el comportamiento de este modelo de vista. Creé mi proyecto de pruebas unitarias, agregué una nueva prueba unitaria para el modelo de vista y escribí una prueba de humo simple. (es decir, dadas las dependencias burladas, la instancia de clase).

Bam, sin

Sin embargo, la clase funciona bien cuando se ejecuta normalmente. Tras una inspección más, mi error es como sigue:

TestInitialize threw exception: System.UriFormatException: Invalid URI: Invalid port specified.

Así pues, siguiendo la pila de llamadas llego a la conclusión de que las URL de mi paquete utilizan para cargar los flujos de recursos son las patadas de los errores.

pack://application:,,,/Operations.Shell;component/Media/Images/User_Normal.png

(Nota: Operations.Shell es el nombre de ensamblado, /Media/Images/User_Normal.png es la ruta de la imagen/nombre, y esta url paquete funciona en la práctica.)

es la URL paquete que tengo para mi User_Normal.png, el archivo existe, el recurso se empaqueta adecuadamente en el ensamblaje (marcado con reflector).

El problema surge de la clase System.Uri no ser capaz de interpretar la url paquete. Aquí es donde me estoy perdiendo. ¿Por qué esto no funcionaría en los límites de las pruebas? todas las asambleas de WPF he referido en mi proyecto de prueba:

  • WindowsBase
  • PresentationCore
  • PresentationFramework
  • System.Xaml

¿Qué me falta?

actualización

bien por lo que el problema original era que el UriHandler no estaba registrada para las direcciones URL de carga. (Gracias a Julien Lebosquain) Ahora que está fijado todavía está teniendo problemas.

TestInitialize threw exception: System.NotSupportedException: The URI prefix is not recognized.

 
System.Net.WebRequest.Create(Uri requestUri, Boolean useUriBase) 
System.Net.WebRequest.Create(Uri requestUri) 
MS.Internal.WpfWebRequestHelper.CreateRequest(Uri uri) 
System.IO.Packaging.PackWebRequest.GetRequest(Boolean allowPseudoRequest) 
System.IO.Packaging.PackWebRequest.GetResponse() 
MS.Internal.WpfWebRequestHelper.GetResponse(WebRequest request) 
System.Windows.Media.Imaging.BitmapDecoder.SetupDecoderFromUriOrStream(Uri uri, Stream stream, BitmapCacheOption cacheOption, Guid& clsId, Boolean& isOriginalWritable, Stream& uriStream, UnmanagedMemoryStream& unmanagedMemoryStream, SafeFileHandle& safeFilehandle) 
System.Windows.Media.Imaging.BitmapDecoder.CreateFromUriOrStream(Uri baseUri, Uri uri, Stream stream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, RequestCachePolicy uriCachePolicy, Boolean insertInDecoderCache) 
System.Windows.Media.Imaging.BitmapImage.FinalizeCreation() 
System.Windows.Media.Imaging.BitmapImage.EndInit() 
System.Windows.Media.Imaging.BitmapImage..ctor(Uri uriSource, RequestCachePolicy uriCachePolicy) 
System.Windows.Media.Imaging.BitmapImage..ctor(Uri uriSource) 
MyFramework.Resources.b__1(Uri u) 
MyFramework.Resources.ResourceType`1.Load(String path) 
Operations.Shell.AppShell.ViewModels.HeaderViewModel..ctor(IEventAggregator eventAggregator, ISecurityService securityService) 
Tests.Shell.AppShell.TestHeaderViewModel.TestInitialize() 

Parece que la URL de paquete de tratar de resolver a algo basado en la web para un paquete url asamblea? Parece que el enrutador del enrutador la solicitud es incorrecta? ¿O me estoy perdiendo algo?

+0

@Downvoter, ¿tiene alguna razón? – Aren

Respuesta

16

que le picaron por este problema una vez demasiado ...

referencia a las asambleas no es suficiente. WPF tiene que llamar System.UriParser.Register() con su propio analizador URI para que pueda interpretar System.Uri URL de carga.

Reflexionando nos dice que esto es hecho por el constructor estático de System.IO.Packaging.PackUriHelper. Llame a cualquier método de esta clase en su prueba, como PackUriHelper.Create() para asegurarse de que el analizador URI esté bien registrado. Algo feo, pero debería funcionar.

+0

@Julien Lebosquain - Tenías razón (+1), pero todavía hay problemas. Consulte la sección actualizada en la publicación original para obtener más detalles. ¿Tuviste este problema también? – Aren

+2

Lo resolvió. Había más en el Marco WPF que necesitaba inicialización para agregar un manejador de prefijo url a WebRequest/WebResponse. Terminé instanciando un objeto 'FrameworkElement', que parecía cargar lo suficiente del framework a través de constructores estáticos. – Aren

+2

Al crear un FrameworkElement se iniciará el mismo proceso que con la creación de la clase de aplicación, pero probablemente será más rápido. ¡Bueno saber! –

1

Creo que se puede solucionar este problema mediante la creación de una instancia de la clase principal de la aplicación antes de ejecutar cualquier prueba. Esto conectará los manejadores que menciona Julien en la otra respuesta.

+0

Prefiero no girar mi aplicación para probar los componentes. – Aren

2

Una pequeña muestra de código para agregar a las respuestas anteriores. Usamos lo siguiente en una prueba unitaria para evitar este problema.

[AssemblyInitialize] 
    public static void MagicHappensHere(TestContext context) { 

     PackUriHelper.Create(new Uri("reliable://0")); 
    } 

Una vez que esto se ha llamado al inicio de la prueba, todo funciona perfectamente.

12

Basándose en otras respuestas, aquí está el (NUnit) de código que hacen mis pruebas van verde:

En AssemblyInfo.cs:

[assembly: RequiresSTA] 

en su propio archivo:

[SetUpFixture] 
public class PreTestSetup 
{ 
    [SetUp] 
    public void Setup() 
    { 
     PackUriHelper.Create(new Uri("reliable://0")); 
     new FrameworkElement(); 
     System.Windows.Application.ResourceAssembly = typeof (App).Assembly; 
    } 
} 

La aplicación es mi clase de aplicación principal. Cualquier clase en el conjunto relevante lo hará, presumiblemente.

+0

El truco para mí en mis pruebas también; ¡Gracias! –