C# PropertyChanged事件测试:这是一种好方法吗?

C# PropertyChanged事件测试:这是一种好方法吗?,c#,.net,wpf,mvvm,mstest,C#,.net,Wpf,Mvvm,Mstest,我正在使用MVVM模式开发WPF应用程序。我有如下代码的ViewModel: public bool EditModeEnabled { get { return _EditModeEnabled; } set { _ModeEditModeEnabled = value; OnPropertyChanged("EditModeEnabled"); OnPropertyChanged("CommentTextBoxVisib

我正在使用MVVM模式开发WPF应用程序。我有如下代码的ViewModel:

public bool EditModeEnabled
{
    get { return _EditModeEnabled; }
    set
    {
        _ModeEditModeEnabled = value;
        OnPropertyChanged("EditModeEnabled");
        OnPropertyChanged("CommentTextBoxVisibility");
    }
}
var imageViewModel = TestHelper.GetTestImageViewModel();
imageViewModel.ShouldNotifyOn(s => s.EditModeEnabled)
    When(s => s.Mode = true);
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"));
    ...
}
public void EditModeEnabledTest()
{
var imageViewModel=TestHelper.GetTestImageViewModel();
var firedEvents=新列表();
imageViewModel.PropertyChanged+=((发件人,e)=>firedEvents.Add(e.PropertyName));
imageViewModel.Mode=true;
Assert.AreEqual(firedvents.Count,2);
Assert.IsTrue(firedvents.Contains(“EditModeEnabled”);
Assert.IsTrue(firedvents.Contains(“CommentTextBoxVisibility”);
...
}
这是测试propertychanged事件的好方法吗?

我使用a来完成这项工作。它允许您编写如下测试:

public bool EditModeEnabled
{
    get { return _EditModeEnabled; }
    set
    {
        _ModeEditModeEnabled = value;
        OnPropertyChanged("EditModeEnabled");
        OnPropertyChanged("CommentTextBoxVisibility");
    }
}
var imageViewModel = TestHelper.GetTestImageViewModel();
imageViewModel.ShouldNotifyOn(s => s.EditModeEnabled)
    When(s => s.Mode = true);
除了简洁之外,我更喜欢这种方法,因为它是类型安全的——没有字符串值与API保持同步


要测试为多个属性引发的事件,您只需编写另一个测试即可。这将为您提供许多测试,但每个测试都非常小,您可以避免。

我认为在您所展示的示例中对PropertyChanged事件进行单元测试是一个好主意。您可能已将属性名称字符串写入错误,这将导致缺少更新

使用,编写这样的单元测试非常容易:

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

与Mark Seemann的建议类似,通过流畅的断言,您可以使用简单、好的方法来概括所有内容,如:

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

好东西。。。我正要写我自己的包装,但我想我应该先检查一下,瞧。。。这里是>8)我稍微调整了您的解决方案以使用xUnit。谢谢