我正在使用MVVM模式开发WPF应用程序。我有ViewModel,代码如下:
public bool EditModeEnabled
{
get { return _EditModeEnabled; }
set
{
_ModeEditModeEnabled = value;
OnPropertyChanged("EditModeEnabled");
OnPropertyChanged("CommentTextBoxVisibility");
}
}
OnPropertyChanged
是基类的虚方法,它只引发PropertyChanged
事件。
我想测试PropertyChanged
事件提升和我的测试方法:
public void EditModeEnabledTest()
{
var imageViewModel = TestHelper.GetTestImageViewModel();
var firedEvents = new List<string>();
imageViewModel.PropertyChanged += ((sender, e) => firedEvents.Add(e.PropertyName));
imageViewModel.Mode = true;
Assert.AreEqual(firedEvents.Count, 2);
Assert.IsTrue(firedEvents.Contains("EditModeEnabled"));
Assert.IsTrue(firedEvents.Contains("CommentTextBoxVisibility"));
...
}
测试ProprtyChanged事件是一种好方法吗?
答案 0 :(得分:11)
我使用little Fluent API来做到这一点。它允许你编写这样的测试:
var imageViewModel = TestHelper.GetTestImageViewModel();
imageViewModel.ShouldNotifyOn(s => s.EditModeEnabled)
When(s => s.Mode = true);
除了简洁之外,我更喜欢这种方法,因为它是类型安全的 - 没有字符串值可以与您的API保持同步。
要测试是否为多个属性引发了事件,您可以编写另一个执行此操作的测试。这将为您提供许多测试,但每个测试都非常小,您可以避免使用Assertion Roulette。
答案 1 :(得分:1)
我认为在您展示的示例中对PropertyChanged事件进行单元测试是个好主意。您可能已将错误的属性名称字符串写入,这将导致更新丢失。
使用WPF Application Framework (WAF)编写这样的单元测试非常容易:
Person person = new Person();
AssertHelper.PropertyChangedEvent(person, x => x.Name, () => person.Name = "Luke");
答案 2 :(得分:0)
类似于Mark Seemann的建议,通过Fluent Assertions,您可以使用简单而美观的方法将所有内容打包起来,例如:
subject.Should().Raise().PropertyChangeFor(x => x.SomeProperty);