mercredi 8 décembre 2010

Silverlight – Astuces – Projet de tests unitaires

Comme pour chacun de mes projets, je fais des tests unitaires.
Il en est de même pour les applications Silverlight.

C’est comme ça que j’ai découvert qu’il existait un projet de type Tests unitaires pour Silverlight.

Par contre, utilisant essentiellement Silverlight avec MOSS, je fais tout le temps appel aux web services de celui-ci.
Il faut donc que je teste l’appel aux services de façon asynchrone.

Donc, je vais rapidement survoler la solution utilisée.

Pour infos, mes applis silverlight utilise MVVM donc les appels sont effectués via un ServiceLocator dans mon Model

Pré-requis : Silverlight toolkit

Création du Projet :

creer_projet_test

On ajoute les références au projet Silverlight à tester

On compléte la clase Test générée:

[TestClass]
public class Tests : Microsoft.Silverlight.Testing.SilverlightTest //pour l'asynchrone
{
   private const String _mossUrlRoot = "http://monMoss";
   private Boolean _httpResult;
   public Tests() : base()
   {
       //http://msdn.microsoft.com/en-us/library/system.net.browser.webrequestcreator.clienthttp(VS.95).aspx
       //WebRequestCreator.ClientHttp : car j'envoi du XML dans mes requests et j'utilise les ws de moss 
       _httpResult = HttpWebRequest.RegisterPrefix(_mossUrlRoot, WebRequestCreator.ClientHttp);
       var request = WebRequest.Create(new Uri(_mossUrlRoot)) as HttpWebRequest;
       request.UseDefaultCredentials = true;
    }
[Asynchronous] //car appel asynchrone
[TestMethod]
 public void MVVM_Model_Get_Items()
{
    if (_httpResult)
    {
      //Initialise mes services
      Model.ServiceLocator.InitializeServicesTest(initParams, _mossUrlRoot);
      //Lance la requete 
      Model.ServiceLocator.MesServices.LaunchRequest();
      
      EnqueueConditional(
        () => Model.ServiceLocator.MesServices.Result != null);
      EnqueueCallback(
        () => Assert.IsTrue(Model.ServiceLocator.MesServices.Result.Count > 0));
      EnqueueTestComplete(); 
    //fin du test, mais le Assert est en attente du resultat
     }
}
}


On lance le teste, via un “View in Browser” sur le projet, voilà le résultat :



tests_unitaires



Le méthode de test bien qu’asynchrone est passée sans souci.



Si nous n’avions pas utilisé les “EnqueueCallBack” et “EnqueueTestComplete”, le test aurait retourné une erreur.



Pour réussir ce test, je me suis appuyé sur cet article : http://code.msdn.microsoft.com/silverlightut

Silverlight – Astuce – Cache du navigateur et mise à jour XAP

Mon contexte :

Une webpart dans mon MOSS héberge une application Silverlight.
A chaque mise à jour, je redéploye ma solution via une wsp.
Pour autant, même si mon XAP à bien changé, rien ne change sur le poste client car le XAP est stocké dans le cache du navigateur.

Le problème :

Il faut que je puisse mettre à jour le XAP sur tous les postes à chaque mise à jour sans perdre l’intérêt du cache du navigateur (et sans demander aux utilisateurs de vider leur cache).

La solution :

Elle est finalement simple.
Dans ma webpart, je gère la version de mon XAP en passant juste un paramètre à l’URL du XAP.

Par exemple :
String _xapPath = "/_layouts/RIA/XAP/MonXAP.xap?version=1.0";

Ici le paramètre s’appelle “version” (mais peu importe le nom) et la version est 1.0

Et je l’insère dans le code html qui appelle le XAP

Ainsi, à chaque fois que je change la version du XAP dans ma webpart et que je redéploye ma solution, l’application est re-téléchargée sur le poste client.

Tant que la version ne change pas, le client utilise la version de son cache.

Astuce très simple mais qui me permet de choisir quand l’application doit être remise à jour.

mardi 7 décembre 2010

Silverlight – Carte vectorielle dynamique grâce à ViewerSVG

Contexte :

Sur notre MOSS, nous avons des actualités classées par pays et continents.
Pour rendre l’affichage plus ludique, nous avons décidé d’afficher les news en fonction des choix d’une carte.

Voici les captures du résultat final :

monde

On clique sur un continent, et on a les news qui s’affichent sur la droite.
Mais pour l’Europe, un zoom est nécessaire afin de filtrer par pays

europe

Donc, chaque continent et chaque pays de l’Europe est une zone sélectionnable.

La solution :

Pour pouvoir faire ces cartes, je suis parti d’un format vectoriel de la carte des continents et de la carte des pays de l’Europe.
Ensuite, il a fallu transformer le tout en XAML.

Pour transformer chaque continent/pays en “Path” Silverlight, j’ai utilisé un logiciel très intéressant : ViewerSVG

Il n’est pas très cher et permet de transformer tout objet SVG en XAML. Parfait pour utiliser des images créées par un designer.