Модульное тестирование WPF, UIElement.RaiseEvent, ArgumentException - PullRequest
1 голос
/ 12 марта 2009

Я пытаюсь создать модульный тест и хотел бы подделать DropEvent.

Я получаю сообщение об ошибке при попытке вызвать событие. Я не могу создать DragEventArgs, если уровень защиты является внутренним.

System.ArgumentException : Object of type 'System.Windows.RoutedEventArgs' cannot be converted to type 'System.Windows.DragEventArgs'

У меня есть следующее ...

        [Test]
    public void Test()
    {
        DesignerMock view = new DesignerMock();
        _viewModel = (PanelDesignViewModel)view.DataContext;
        view.Show();

        Assert.IsNotNull(_viewModel);

        RoutedEventArgs args = new RoutedEventArgs(DesignerCanvas.DropEvent,view.DesignerCanvas) ;
        view.DesignerCanvas.RaiseEvent(args);

        view.Close();

    }

Ответы [ 2 ]

1 голос
/ 23 марта 2009

Как говорит ascalonx, вы не должны проверять свой View, только вашу ViewModel. Это означает, что ваша ViewModel должна быть отделена от View. Вместо обработчика событий представьте простой открытый метод в ViewModel, который будет выполнять всю необходимую вам работу, и просто вызовите его в своем тесте. Чтобы ваш View вызывал этот метод, используйте прикрепленное поведение. Caliburn имеет приятное поведение "Actions" для этого.

Вы упоминаете, что у вас также есть кое-что из VisualTreeHelper. Это является нарушением шаблона M-V-VM, поскольку он связывает вашу виртуальную машину с конкретной реализацией V. Что бы вы там ни делали, абстрагируйте это от «сервисного» интерфейса и используйте IoC или Service Locator для предоставления этой услуги вашей виртуальной машине. Я мог бы предложить посмотреть на Onyx для этого (отказ от ответственности: я являюсь автором этой библиотеки). Он предоставляет гибкий и простой в использовании механизм для предоставления услуг вашей виртуальной машине.

0 голосов
/ 13 марта 2009

Если вы непреклонны в том, что хотите протестировать свой код таким образом, вы можете использовать отражения для создания DragEventArgs. Однако, реальный вопрос, я думаю, заключается в том, идете ли вы в правильном направлении со своим модульным тестированием. Я обычно избегаю проводить какие-либо тесты непосредственно на своих представлениях и придерживаюсь более легко тестируемых моделей представления (если вы действительно используете MVVM) из-за именно той проблемы, с которой вы столкнулись прямо сейчас.

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