Как написать тест для привязки команды WPF?

У меня есть класс "команды":

public static class MyCommands
{
    private static ICommand exitCommand = new RoutedCommand();

    public static ICommand ExitCommand { get { return exitCommand; } }
}

Код программной части в MainWindow.xaml.cs:

private void BindCommands()
{
    this.CommandBindings.Add(new CommandBinding(MyCommands.ExitCommand, this.Exit));
}

private void Exit(object sender, ExecutedRoutedEventArgs e)
{
    Application.Current.Shutdown();
}

И немного XAML в пользовательском элементе управления, который реализует строку меню:

<MenuItem Header="_Exit"
          Command="{x:Static local:MyCommands.ExitCommand}"
          />

Код работает. Мне нравится общая схема, и я хотел бы продолжать ее использовать.

Тем не менее, я также пытаюсь преследовать некоторые другие цели, такие как разработка через тестирование и достижение 100% покрытия моими модульными и интеграционными тестами. Я также хотел бы иметь 100% соответствие предупреждениям StyleCop и FxCop. И я пойман здесь.

Мой метод MainWindow.Exit() является закрытым в соответствии с рекомендациями FxCop (Microsoft.Security:CA2109), но это означает, что я не могу вызвать его непосредственно из теста. Я полагаю, я мог бы сделать это общедоступным и скрыть сообщение FxCop. Или я могу использовать аксессуар. Но у меня есть предубеждение против написания тестов непосредственно против закрытых методов, особенно в этом случае, поскольку все, что нужно сделать, это проверить метод, а не саму привязку команды.

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


person mlibby    schedule 16.09.2009    source источник


Ответы (2)


Я понимаю, что это старый вопрос, но я решил, что отвечу, если это поможет кому-то еще.

Вы можете вызывать команды из кода программной части следующим образом:

ICommand command = ExitCommand;

command.Execute();

Это выполнит Exit() и не требует доступа. Это то, что ты искал?

person mfanto    schedule 18.07.2010
comment
Вау, теперь я знаю, как тестировать мои модели представления, которые зависят исключительно от команд (которые поддерживаются частными методами) - person Matthew S; 26.01.2018

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

person Kent Boogaart    schedule 16.09.2009
comment
Мои обработчики событий кода программной части в основном будут однострочными — либо простая логика пользовательского интерфейса (как в примере), либо методы API в коде модели. Я также планирую использовать зависимость от внедрения, чтобы я мог имитировать такие вещи, как Application.Current, и проверять, что был вызван Shutdown(). Но я не могу понять, как вызвать команду, чтобы мой обработчик событий запускался во время моего теста. Как я уже сказал, я мог бы использовать метод доступа для вызова закрытого метода, но мне бы очень хотелось использовать систему команд для автоматической проверки правильности соединения всех компонентов. - person mlibby; 17.09.2009