Как избежать просмотра конкретного кода в моей ViewModel - PullRequest
2 голосов
/ 13 ноября 2009

В моем приложении есть пункт меню, позволяющий создать новую учетную запись. Команда пункта меню привязана к команде (NewAccountCommand) в моей ViewModel. Когда пользователь выбирает вариант создания новой учетной записи, приложение отображает диалоговое окно «Новая учетная запись», в котором пользователь может ввести такие данные, как имя, адрес и т. Д., А затем нажимает «ОК», чтобы закрыть диалоговое окно и создать новый аккаунт.

Я знаю, что мой код в ViewModel неверен, поскольку он создает диалоговое окно «Новая учетная запись» и вызывает ShowDialog (). Вот фрагмент из ВМ:

 var modelResult = newAccountDialog.ShowDialog();
 if (modelResult == true)
 {
   //Create the new account             
 }

как мне избежать создания и отображения диалогового окна внутри моей виртуальной машины, чтобы можно было выполнить модульное тестирование виртуальной машины?

Ответы [ 4 ]

2 голосов
/ 13 ноября 2009

Мне нравится подход, описанный в этой статье: http://www.codeproject.com/KB/WPF/XAMLDialog.aspx

В основном он создает элемент управления WPF Dialog, который может быть встроен в визуальное дерево другого окна или пользовательского элемента управления.

Затем используется триггер стиля, который заставляет диалоговое окно открываться всякий раз, когда в диалоге есть содержимое.

так что в xaml все, что вам нужно сделать, это (где DialogViewModel - это свойство вашей ViewModel):

<MyControls:Dialog Content = {Binding DialogViewModel}/>

и в вашей ViewModel вам просто нужно сделать следующее:

DialogViewModel = new MyDialogViewModel();

так что в модульном тестировании все, что вам нужно сделать, это:

MyViewModel model = new MyViewModel();
model.DialogViewModel = new MyDialogViewModel();
model.DialogViewModel.InputProperty = "Here's my input";
//Assert whatever you want...

Я лично создаю свойство ICommand в моем ViewModel, которое устанавливает свойство DialogViewModel, чтобы пользователь мог нажать кнопку, чтобы открыть диалоговое окно.

Так что моя ViewModel никогда не вызывает диалог, он просто создает свойство. Представление интерпретирует это и отображает диалоговое окно. Вся прелесть в том, что если вы решите вообще изменить свое представление и, возможно, не отобразить диалоговое окно, вашей ViewModel не нужно менять один бит. Он выталкивает весь код взаимодействия с пользователем туда, где он должен быть ... в представлении. И создание элемента управления wpf позволяет мне повторно использовать его всякий раз, когда мне нужно ...

Есть много способов сделать это, я нашел, что это хорошо для меня. :)

1 голос
/ 17 ноября 2009

Платформа приложений WPF (WAF) показывает конкретный пример того, как этого добиться.

Пример приложения ViewModel показывает почтовый клиент, в котором вы можете открыть диалоговое окно «Настройки учетной записи электронной почты». Он использует внедрение зависимостей (MEF), поэтому вы все еще можете выполнить модульное тестирование ViewModel.

Надеюсь, это поможет.

JBE

1 голос
/ 13 ноября 2009

В подобных сценариях я обычно использую события. Модель может вызвать событие, чтобы запросить информацию, и любой может ответить на нее. Представление будет прослушивать событие и отображать диалоговое окно.

public class MyModel
{
    public void DoSomething()
    {
        var e = new SomeQuestionEventArgs();
        OnSomeQuestion(e);
        if (e.Handled)
            mTheAnswer = e.TheAnswer;
    }
    private string mTheAnswer;
    public string TheAnswer
    {
        get { return mTheAnswer; }
    }
    public delegate void SomeQuestionHandler(object sender, SomeQuestionEventArgs e);
    public event SomeQuestionHandler SomeQuestion;
    protected virtual void OnSomeQuestion(SomeQuestionEventArgs e)
    {
        if (SomeQuestion == null) return;
        SomeQuestion(this, e);
    }
}
public class SomeQuestionEventArgs
    : EventArgs
{
    private bool mHandled = false;
    public bool Handled
    {
        get { return mHandled; }
        set { mHandled = value; }
    }
    private string mTheAnswer;
    public string TheAnswer
    {
        get { return mTheAnswer; }
        set { mTheAnswer = value; }
    }
}
public class MyView
{
    private MyModel mModel;
    public MyModel Model
    {
        get { return mModel; }
        set
        {
            if (mModel != null)
                mModel.SomeQuestion -= new MyModel.SomeQuestionHandler(mModel_SomeQuestion);
            mModel = value;
            if (mModel != null)
                mModel.SomeQuestion += new MyModel.SomeQuestionHandler(mModel_SomeQuestion);
        }
    }
    void mModel_SomeQuestion(object sender, SomeQuestionEventArgs e)
    {
        var dlg = new MyDlg();
        if (dlg.ShowDialog() != DialogResult.OK) return;
        e.Handled = true;
        e.TheAnswer = dlg.TheAnswer;
    }
}
0 голосов
/ 13 ноября 2009

Существуют разные подходы к этому. Одним из распространенных подходов является использование некоторой формы внедрения зависимостей для внедрения службы диалога и использования службы.

Это позволяет подключить любую реализацию этой службы (т. Е. Другое представление) во время выполнения и дает некоторую связь между ViewModel и View.

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