Объяснение модульного тестирования Silverlight MVVM - PullRequest
1 голос
/ 08 апреля 2009

Может кто-нибудь объяснить, почему, когда я выполняю свои юнит-тесты с помощью отладчика, я получаю нулевые ссылки при просмотре объектов или свойств. Например:

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   

Я знаю, что я делаю что-то не так, но кто-нибудь может объяснить, что?

Спасибо, Mark

Ответы [ 2 ]

2 голосов
/ 08 апреля 2009

Я предполагаю, что проблема в том, что вы создаете экземпляр объекта Shell изолированно. Вы подтвердили, что Shell_Loaded (событие Loaded) даже вызывается?

Почему вы не создаете модель представления в качестве статического ресурса в своем xaml? С MVVM я обычно создаю его как статический ресурс в xaml, а затем связываю его как контекст данных в LayoutRoot ... все в xaml.

2 голосов
/ 08 апреля 2009

Вы устанавливаете DataContext во время события Loaded, которое возникает, когда ваш элемент управления фактически загружается в визуальное дерево. Следовательно, ваш DataContext не будет установлен, потому что все, что вы сделали, это построили представление. Вы можете легко проверить это, запустив свои модульные тесты с подключенным отладчиком и установив точку останова в обработчике Loaded.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...