Loupe

Tests unitaires et Windows 8.1 : comment pouvoir les exécuter même si l’on définit des Dependency Properties personnalisées #WinDev #UWP

Aujourd’hui je suis tombé sur un bug très sympathique : impossible d’executer des tests unitaires d’une app Windows 8.x à partir du moment ou des DependencyProperties personnalisées sont présentes. Les test unitaires crashent tout simplement en vous proposant de debugger ou sur l’exception “System.BadImageFormatException” si vous avez configuré votre VisualStudio pour breaker sur les exceptions.

bug1 

 

Une solution glanée sur le net consiste à référencer l’exécutable correspondant à l’application à tester plutôt que le projet de la solution. Je ne trouve pas cela génial pour plusieurs raisons :

  • un nouvel arrivant n’aura pas cet exe sur son poste de travail car il n’a pas encore compilé la solution,
  • on ne s’assure pas que la version testée est bien la dernière car la compilation du projet de tests unitaires ne compile pas (par défaut) le projet correspondant car il n’est pas référencée

 

Au final, pour que cela fonctionne, il suffirait que les types en questions ne soient pas déclarés dans le fichier App.xaml. Cela est malheureusement souvent le cas car l’on définit le dictionnaire de ressources de façon déclarative dans le fichier App.xaml.

La solution que je souhaite vous proposer est donc la suivante :

  • Définir le fichier de ressources correspondant à l’application dans un fichier à part. AppResources.xaml par exemple,
  • Charger celui-ci à l’execution lorsque l’application est lancée.

Cela n’a aucun impact sur l’execution de l’application est permet d’écrire des tests unitaires. Je vous conseille tout de même de mettre un commentaire dans le fichier App.Xaml afin d’expliquer le comportement.

 

Voici le code à exécuter pour charger le dictionnaire de ressources :

 protected override async void OnLaunched(LaunchActivatedEventArgs e)
 {
     var source = new Uri(
         "ms-appx:///Assets/ResourcesDictionnaries/AppResources.xaml", 
         UriKind.RelativeOrAbsolute);

     var resourceDictionary = new ResourceDictionary { Source = source };
     Resources.MergedDictionaries.Add(resourceDictionary);

     /* .... */
}
Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus