2010-10-01 21 views
1

Je développe une application Windows Forms .NET. J'utilise le modèle de conception modèle-présentateur-présentateur, contrôleur de supervision , pour être plus précis.Comment tester l'expérience utilisateur concernant les processus d'arrière-plan à exécution longue dans une application Windows Forms?

Les présentateurs de mon application effectuent des opérations d'arrière-plan, , ce qui peut prendre plusieurs secondes (ou plus). Une fois le processus d'arrière-plan terminé, le présentateur appelle un appel sur la vue, en lui transmettant toutes les données dont il a besoin pour afficher/mettre à jour le formulaire. Tout cela fonctionne bien.

Maintenant, je veux être en mesure de tester l'expérience de l'utilisateur, en ce qui concerne ces processus d'arrière-plan de longue durée. Par exemple, je veux voir comment l'interface utilisateur se comporte et se comporte, lorsqu'un ou plusieurs processus d'arrière-plan sont en cours d'exécution.

Pour ce faire, j'ai placé des appels Thread.Sleep (..) dans mes présentateurs, entourés d'un symbole de compilation #IF DEBUG. Je n'aime pas cela, car il encombre mon code, il est difficile à maintenir et peut facilement fuir dans le code de production. Avez-vous une meilleure solution pour tester l'expérience utilisateur en ce qui concerne les processus d'arrière-plan de longue durée dans une application WinForms?

Répondre

0

Je suis toujours intéressé par les réponses, mais pour le moment, je posterai ma solution actuelle. Au lieu de lancer un processus d'arrière-plan à partir du présentateur, le présentateur délègue maintenant ce processus à un gestionnaire d'actions.

Si je veux tester l'ux, je lance l'application avec un ActionManager qui a un délai d'une seconde avant d'exécuter la commande. Cela me permet d'inspecter le comportement de l'interface utilisateur.

Cela résout mon problème. Les présentateurs ressemblent maintenant à quelque chose comme ceci:

internal class ItemListPresenter : IItemListPresenter 
{ 
    // member variables 
    // ... 
    public ItemListPresenter(IItemListView itemListView, IActionManager cmdManager) 
    { 
     _view = itemListView; 
     _mngr = cmdManager; 
     _syncCtxt = SynchronizationContext.Current; // let's assume we're constructed from the UI thread. 
    } 

    // IItemListPresenter method: 
    public void StartLoadingItemsSession() 
    { 
     ShowBusy(); 
     ClearResults(); 
     _mngr.Post(LoadItems); 
    } 

    // ... 

    private void LoadItems() 
    { 
     UpdateViewWith(GetItems()); 
     SetReady(); 
    } 

    // ... 
    // IItemListView method 
    private void UpdateViewWith(Item[] newItems) 
    { 
     _syncCtxt.Post(state => _view.AddResults(newItems), newItems); 
    } 

    // ... 
} 
+0

Et cette solution a une meilleure sep. des préoccupations, à je pense. – Marijn