2009-04-08 19 views
1

デバッガで単体テストをステップ実行すると、オブジェクトやプロパティを参照しているときにnull参照を取得する理由を誰でも説明できますか。たとえば、次のように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]私はシェルビューのDataContextのに私のViewModelフィールドを設定すると、私は「オブジェクトインスタンスに設定されていません...」例外を取得。私は自分の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 

私は何か間違っていると知っていますが、誰でも何を説明することができますか?

あなたがあなたのコントロールが実際にビジュアルツリーにロードされたときに発生するイベントLoaded、中にDataContextを設定しているおかげで、 マーク

答えて

2

私は、シェルオブジェクトを単独でインスタンス化するという問題があると推測しています。 Shell_Loaded(ロードされたイベント)が呼び出されていることを確認しましたか?

xamlで静的リソースとしてビューモデルを作成していないのはなぜですか? MVVMでは、通常xamlの静的リソースとして作成し、LayoutRoot ... allのxamlのデータコンテキストとしてバインドします。

+0

私は開発者ですが、古い習慣は辛く死ぬ;-)私はそれを試して、よりよい結果が得られるかどうかを見ていきます。ありがとう –

2

。したがって、完了したすべてのビューが作成されるため、DataContextは設定されません。デバッガを接続してユニットテストを実行し、ハンドラにブレークポイントを設定することで、簡単に確認できます。

+0

私は、Loadedイベントが発生するのを待機するためにEnqueueConditionalを使用するWaitFor()メソッドのJustin Angelsのアイデアを使用して試しました。私はまだ具体的なオブジェクトを見ないので、簡単にするために削除しました。 –

+0

ユニットテストで積み込みが行われない可能性があります。 Kentが述べたように、Loadedは要素がビジュアルツリーに追加されたときにのみ発生します。あなたの単体テストが実際にシェルを表示しない限り、Loadedは起動しません。 –