Как писать код, управляемый модульным тестом, без обработчиков PropertyChanged везде - PullRequest
0 голосов
/ 24 апреля 2018

Допустим, у меня есть эта спецификация:

Given a UserProfile with some User and some UserPrefs
When ShowEmail in UserPrefs is set to true
Then the Email field in UserProfile should be the User's Email
And when ShowEmail in UserPrefs is set to false
Then the Email field in UserProfile should be "Hidden"

Круто.Достаточно просто;Я просто сделаю это в UserProfileViewModel:

public string Email
{
  get
  {
    if (UserPrefs.ShowEmail)
      return User.Email;
    else
      return "Hidden";
  }
}

И теперь я сделал минимум, необходимый для перехода в зеленый цвет (я изменяю состояние моего макета IUserPref, а затем запрашиваю UserProfileViewModel.Email),Большой;кроме случаев, когда UserPrefs изменяет состояние внутри себя из-за другой бизнес-логики, любая привязка представления к UserProfileViewModel.Email бесполезна.

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

Вопрос: Существует ли чистый способ сделать тест без единой связки обработчиков PropertyChanged везде?PropertyChanged.Fody в некоторой степени помогает с такими вещами, но не совсем с этим конкретным сценарием.

1 Ответ

0 голосов
/ 24 апреля 2018

Проблема:
Основные данные для модели представления изменяются, но модель представления не уведомляет о представлении об этом изменении.

Решения:
1) Создайте и свяжите новую модель представления споследние базовые данные.
2) Вместо того, чтобы выставлять базовый класс User напрямую через свойство.Создайте вспомогательную переменную _email, которая будет вызывать изменение свойства при обновлении, и синхронизируйте его с основными данными.Так ViewModel.Email = UserPrefs.ShowEmail, когда UserPrefs обновляется бизнес-логикой.
3) Обновите UserPrefs, чтобы вызвать событие Updated, которое можно использовать для вызова PropertyChanged, когда бизнес-логика обновляет UserPrefs.

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

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

...