PropertyChanged事件测试:这是一个好方法吗?

时间:2009-12-08 08:11:35

标签: c# .net wpf mvvm mstest

我正在使用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事件是一种好方法吗?

3 个答案:

答案 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);

来源 https://fluentassertions.com/eventmonitoring/