如何在没有PropertyChanged处理程序的情况下编写单元测试驱动的代码

时间:2018-04-24 15:07:26

标签: .net unit-testing mvvm data-binding tdd

假设我有这个规格:

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 :(得分:0)

问题:
视图模型的基础数据发生了更改,但视图模型未通知该更改的视图。

解决方案:
1)使用最新的基础数据创建并绑定到新的viewmodel 2)而不是直接通过属性公开底层的User类。创建一个后备_email变量,该变量在更新时会引发propertychanged并使其与基础数据保持同步。因此,当BusinessPrefs被业务逻辑更新时,ViewModel.Email = UserPrefs.ShowEmail 3)更新UserPrefs以引发可在业务逻辑更新UserPrefs时用于引发PropertyChanged的Updated事件。

我无法在上面的代码中通知PropertyChanged,因为这将不再是使测试通过所需的最低要求。

然后进行另一项测试,测试通知UI数据已更改。