WPF MVVM и модульное тестирование - PullRequest
5 голосов
/ 11 марта 2009

Я работал над приложением WPF и использую шаблон проектирования ModelViewViewModel. У меня есть несколько событий, которые выходят из представления, которые приводят к активности ViewModel.

Каков разумный способ получить эти события из UnitTest? Например, я хочу смоделировать событие отбрасывания. Я на самом деле не хочу создавать заглушку, просто чтобы поднять событие.

Любые предложения приветствуются.

Спасибо.

Ответы [ 4 ]

16 голосов
/ 12 марта 2009

По схеме MVVM:

  • Представление знает о ViewModel - оно будет иметь ссылку на него как на конкретный экземпляр или интерфейс
  • ViewModel вообще не должен знать о представлении.

Если вам нужно обработать события, я знаю, что есть два способа сделать это:

1: Предоставьте команду в вашей модели представления и используйте привязку данных для ее запуска. Это мой предпочтительный способ, например:

class MyViewModel
{
    public ICommand ClickCommand { get; set; }
}

<Button Command="{Binding Path=ClickCommand}" />

Если вы сделаете это, вы можете проверить команду, просто вызвав myViewModel.ClickCommand.Execute вручную.

2: Представьте функцию в модели представления и запишите абсолютный минимум в файле .xaml.cs для обработки события и вызова функции, например:

class MyViewModel
{
    public void HandleClick(){ }
}

<Button Click="MyClickHandler">

//.xaml.cs file
public void MyClickHandler( Object sender, EventArgs e ) {
    m_viewModel.HandleClick()
}

Если вы сделаете это, вы можете проверить, просто позвонив myViewModel.HandleClick вручную. Вам не нужно беспокоиться о модульном тестировании кода MyClickHandler, так как это всего одна строка!

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

Звучит так, как будто у вас есть обработчик события drop непосредственно в вашем классе ViewModel. Будет ли разумнее иметь обработчик на уровне пользовательского интерфейса, который, в свою очередь, будет вызывать функцию в вашей модели представления? Таким образом, ваш модульный тест может просто вызвать функцию (имитирующую операцию перетаскивания, насколько это касается ViewModel).

Кроме того, было бы лучше отделить вашу ViewModel от вашего кода пользовательского интерфейса.

0 голосов
/ 08 июля 2009

Почему вы не используете фальшивый фреймворк, такой как Moq? Проверьте их быстрый старт, у него есть образец насмешливых событий. URL-адрес: http://code.google.com/p/moq/wiki/QuickStart

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

Не вызывайте событие, просто вызовите обработчики (что означает, что они должны быть открытыми и, вероятно, принимать меньше аргументов, ориентированных на обработчик событий). Посмотрите, как это делается в Caliburn (http://www.codeplex.com/caliburn), используя «Действия».

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