2009-04-08 6 views
1

Quelqu'un peut-il expliquer pourquoi, lorsque j'effectue mes tests unitaires avec le débogueur, j'obtiens des références nulles lorsque je regarde des objets ou des propriétés. Par exemple:Silverlight MVVM Unit-Testing Explication

1  [TestMethod] 
2   [Description("Test to confirm that upon initial class creation, the login view is loaded as the default content for the TaskRegion.")] 
3   public void Shell_Initialisation_LoginViewIsLoadedByDefault() 
4   { 
5    Shell shell = new Shell(); 
6  
7    TestPanel.Children.Add(shell); 
8  
9    Shell_ViewModel viewModel = shell.DataContext as Shell_ViewModel; 
10 
11    Assert.IsTrue(viewModel.TaskRegionContent is ContentControl); 
12 
13    EnqueueTestComplete(); 
14   } 

[Ligne 9] Quand je mets mon champ viewmodel à la DataContext de la vue de la coquille, je reçois un « objet non définie à l'instance ... » exception. Je sais avec certitude que mon datacontext est en cours de définition dans mon shell.xaml.cs; dossier entier:

1 using System.Windows; 
2  
3 namespace eg.WorkManager.UI.Shell 
4 { 
5  public partial class Shell 
6  { 
7  
8   public Shell() 
9   { 
10    InitializeComponent(); 
11    this.Loaded += new RoutedEventHandler(Shell_Loaded); 
12   } 
13 
14   void Shell_Loaded(object sender, RoutedEventArgs e) 
15   { 
16    this.DataContext = new Shell_ViewModel(); 
17   } 
18  } 
19 } 
20 

Je sais que je fais quelque chose de mal, mais quelqu'un peut-il expliquer quoi?

Merci, Mark

Répondre

2

Je suppose que le problème est que vous instanciez l'objet Shell isolément. Avez-vous confirmé que Shell_Loaded (l'événement Loaded) est même appelé? Pourquoi ne créez-vous pas votre modèle de vue en tant que ressource statique dans votre xaml? Avec MVVM, je le crée habituellement comme une ressource statique dans le xaml et ensuite le lie comme contexte de données dans LayoutRoot ... tout dans xaml.

+0

Je suis un développeur, les vieilles habitudes meurent dur ;-) Je vais essayer et voir si j'obtiens de meilleurs résultats. Merci –

2

vous réglez la DataContext lors de l'événement Loaded, qui est déclenché lorsque votre commande est effectivement chargé dans l'arborescence visuelle. Par conséquent, votre DataContext ne sera pas défini car tout ce que vous avez fait est construit la vue. Vous pouvez facilement vérifier en exécutant vos tests unitaires avec un débogueur attaché et en définissant un point d'arrêt dans le gestionnaire Loaded.

+0

J'ai donc essayé d'utiliser l'idée de Justin Angels d'une méthode WaitFor(), qui utilise un EnqueueConditional pour attendre que l'événement Loaded se déclenche. Je ne vois toujours pas les objets concrets, alors j'ai supprimé cela pour plus de simplicité. –

+0

Chargé ne tirera probablement pas sous un test unitaire. Comme Kent l'a mentionné, Loaded ne se produit que lorsqu'un élément est ajouté à l'arbre visuel. À moins que votre test unitaire ne montre le shell, Loaded ne se déclenchera pas. –

Questions connexes