【发布时间】:2018-07-27 17:53:33
【问题描述】:
我有以下 XAML。我正在使用 UWP(通用 Windows 平台),但我想描述的问题也适用于其他 XAML 框架,例如 WPF:
<!-- MyVM is a ViewModel -->
<AutoSuggestBox
QueryIcon="Find"
TextChanged="{x:Bind MyVM.FilterTextChanged}"
Text="{x:Bind MyVM.FilterText, Mode=TwoWay}"/>
它是这样工作的:当用户在AutoSuggestBox 中键入文本时,MyVM ViewModel 会被告知每个击键并使用FilterText 过滤数据。
这就是MyVM 的样子:
// Uses INotifyPropertyChanged from MVVMLight
private string filterText;
public string FilterText
{
get { return filterText; }
set { Set(ref filterText, value); }
}
public async void FilterTextChanged()
{
await LoadData(); // uses FilterText to filter data
}
当我需要修改FilterText 值时出现问题,例如清除它或设置预定义的过滤器。由于 TwoWay 绑定,AutoSuggestBox 中的文本可以正确显示,但作为“副作用”,会调用 FilterTextChanged 方法(因为文本已更改)。我不想要这种“副作用”。不好有两个原因:
它使 ViewModel 依赖于 View 中的 XAML。我的意思是,虽然我不调用
FilterTextChanged,但当我设置FilterText值时,它还是会被调用,因为它在XAML 中是双向绑定的。它使自动化单元测试成为不可能。如果没有 XAML,ViewModel 的行为会有所不同:当我设置
FilterText值时,不会调用FilterTextChanged方法。
这是 XAML、MVVM 和 TwoWay 绑定的一般问题,不限于 AutoSuggestBox 的具体示例。
如何解决这个问题?我的主要问题是如何对其进行单元测试?
【问题讨论】:
标签: wpf unit-testing xaml mvvm uwp-xaml