【问题标题】:PropertyChanged event testing: is this a good way?PropertyChanged 事件测试:这是一个好方法吗?
【发布时间】:2010-12-24 08:09:12
【问题描述】:

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

【问题讨论】:

    标签: c# .net wpf mvvm mstest


    【解决方案1】:

    我使用little Fluent API 来做到这一点。它允许您编写这样的测试:

    var imageViewModel = TestHelper.GetTestImageViewModel();
    imageViewModel.ShouldNotifyOn(s => s.EditModeEnabled)
        When(s => s.Mode = true);
    

    除了简洁之外,我更喜欢这种方法,因为它是类型安全的 - 无需与您的 API 保持同步的字符串值。

    要测试是否针对多个属性引发了事件,您可以编写另一个执行此操作的测试。这将为您提供许多测试,但每个测试都非常小,您避免使用Assertion Roulette

    【讨论】:

    • 好东西......我正要编写自己的包装器,但我想我会先检查一下,然后瞧......这里是> 8)我稍微调整了你的解决方案以使用xUnit。谢谢!
    【解决方案2】:

    我认为在您展示的示例中对 PropertyChanged 事件进行单元测试是个好主意。您可能写错了属性名称字符串,这会导致更新丢失。

    使用WPF Application Framework (WAF),编写这样的单元测试非常容易:

    Person person = new Person();
    AssertHelper.PropertyChangedEvent(person, x => x.Name, () => person.Name = "Luke");
    

    【讨论】:

      【解决方案3】:

      类似于 Mark Seemann 的建议,通过 Fluent Assertions,您可以使用简单的好方法来为您包装所有内容,例如:

      subject.Should().Raise().PropertyChangeFor(x => x.SomeProperty);
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-12
        • 2018-02-03
        • 2013-11-05
        • 2012-08-21
        • 2012-07-20
        • 1970-01-01
        相关资源
        最近更新 更多