Как я могу написать тест для привязки WPF Command? - PullRequest
2 голосов
/ 17 сентября 2009

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

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. Или я могу использовать аксессор. Но у меня есть предубеждение против написания тестов непосредственно против частных методов, особенно в этом случае, поскольку все, что делает, это проверяет метод, а не саму привязку команды.

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

Ответы [ 2 ]

5 голосов
/ 19 июля 2010

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

Вы можете вызывать команды из кода с помощью этого:

ICommand command = ExitCommand;

command.Execute();

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

0 голосов
/ 17 сентября 2009

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

...