2009-04-08 59 views
1

任何人都可以解釋爲什麼,當我通過調試器進行單元測試時,我在查看對象或屬性時獲得空引用。例如:Silverlight MVVM單元測試解釋

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   } 

[9號線當我在我的ViewModel字段設置爲殼視圖的DataContext的我得到一個「對象未設置爲實例...」異常。我確信我的datacontext正在設置在我的shell.xaml.cs中;整個文件:

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 

我知道我做錯了什麼,但任何人都可以解釋什麼?

謝謝, 馬克

回答

2

我猜測問題是你正在隔離實例化Shell對象。您是否確認Shell_Loaded(Loaded事件)甚至被調用?

爲什麼你不在xaml中創建視圖模型作爲靜態資源?有了MVVM,我通常將它創建爲xaml中的靜態資源,然後將其作爲LayoutRoot中的數據上下文...將其綁定爲xaml中的所有內容。

2

你設置DataContext期間Loaded事件,當你的控制實際上是加載到可視化樹被提出。因此,您的DataContext將不會被設置,因爲您所做的全部都是構建視圖。您可以通過使用附加的調試器運行單元測試並在Loaded處理程序中設置斷點來輕鬆進行驗證。

+0

所以我嘗試使用Justin Angels的WaitFor()方法,使用EnqueueConditional等待Loaded事件觸發。我仍然沒有看到具體的物體,所以爲了簡單起見我刪除了這些物體。 – 2009-04-08 15:25:05

+0

加載可能不會在單元測試下觸發。正如Kent提到的那樣,Loaded只有在元素被添加到可視化樹中時纔會發生。除非你的單元測試實際顯示shell,否則Loaded不會觸發。 – 2009-04-09 14:59:07