2010-09-14 23 views
14

Quindi ho questa piccola soluzione MVVM e le cose funzionano alla grande. Ho un modello di visualizzazione per una barra di intestazione che regola l'icona in base allo stato dell'applicazione, ecc. Ho fatto test di accettazione, il modello di visualizzazione funziona alla grande.Url pacchetto e test unità. Problema con il mio ambiente?

quindi voglio unità di prova il comportamento di questo modello di vista. Creo il mio progetto di test unitario, aggiungo un nuovo test unitario per il modello di vista e scrivo un semplice test del fumo. (cioè date delle dipendenze derise, la classe istanziata).

Bam, senza

Tuttavia, la classe funziona bene quando correva normalmente. Su ulteriore ispezione, il mio errore è la seguente:

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

Così dopo lo stack di chiamate arrivo alla conclusione che i miei URL confezioni utilizzate per caricare i flussi di risorse sono quelli calci gli errori.

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

(Nota: Operations.Shell è il nome di montaggio, /Media/Images/User_Normal.png è il percorso dell'immagine/nome, e questo URL pacchetto lavora in pratica.)

è l'URL pacchetto che ho per il mio User_Normal.png, il file esiste, la risorsa è correttamente imballata nell'assembly (selezionata con reflector).

Il problema deriva dalla classe System.Uri che non è in grado di interpretare l'url del pacchetto. Questo è dove mi sto perdendo. Perché questo non dovrebbe funzionare nei limiti dei test. Ho tutte le Assemblee WPF si fa riferimento nel mio progetto di test:

  • WindowsBase
  • PresentationCore
  • PresentationFramework
  • System.Xaml

Che cosa mi manca?

Aggiornamento

Va bene così il problema originale era che l'UriHandler non è stato registrato per gli URL del pacchetto. (Grazie a Julien Lebosquain) Ora che è stato risolto ha ancora problemi.

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() 

Sembra che l'URL pacco cercare di risolvere a qualcosa di web-based per un pacchetto url montaggio? Sembra che il gestore stia indirizzando la richiesta in modo errato? O mi sta sfuggendo qualcosa?

+0

@Downvoter, hai una ragione? – Aren

risposta

16

mi sono morso da questo problema una volta di troppo ...

Riferimento assemblee non è sufficiente. WPF deve chiamare System.UriParser.Register() con il proprio parser URI in modo che System.Uri possa interpretare gli URL del pacchetto.

Riflettendo ci dice che questo è fatto dal costruttore statico di System.IO.Packaging.PackUriHelper. Chiamare qualsiasi metodo di questa classe nel test, ad esempio PackUriHelper.Create() per assicurarsi che il parser URI sia registrato correttamente. Un po 'brutto, ma dovrebbe funzionare.

+0

@Julien Lebosquain - Avevi ragione (+1), ma ci sono ancora problemi. Si prega di consultare la sezione aggiornata nel post originale per ulteriori dettagli. Hai avuto anche questo problema? – Aren

+2

Risolto. C'era molto di più nel Framework WPF che necessitava di inizializzazione per aggiungere un gestore di prefisso url a WebRequest/WebResponse. Ho finito per istanziare un oggetto 'FrameworkElement', che sembrava caricare abbastanza del framework attraverso costruttori statici. – Aren

+2

Creazione di un FrameworkElement avvierà lo stesso processo di creazione della classe dell'applicazione, ma probabilmente sarà più veloce. Buono a sapersi! –

1

Penso che sia possibile risolvere questo problema creando un'istanza della classe principale dell'applicazione prima di eseguire qualsiasi test. Questo collegherà i gestori che Julien menziona nell'altra risposta.

+0

Preferisco non avviare la mia applicazione per testare i componenti. – Aren

2

Un esempio di codice piccolo da aggiungere alle risposte sopra. Usiamo il seguente in un test unitario per ovviare a questo problema.

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

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

Una volta che questo è stato chiamato all'avvio di test tutto funziona perfettamente.

12

Basandosi su altre risposte, ecco la (NUnit) Codice che ha fatto il mio test andare verde:

In AssemblyInfo.cs:

[assembly: RequiresSTA] 

In un proprio file:

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

L'app è la mia principale classe di applicazione. Qualsiasi classe nell'assemblea pertinente lo farà, presumibilmente.

+0

Il trucco per me anche nelle mie prove; Grazie! –