c# - 如何使用 OnPropertyChanged() 对 setter 进行单元测试;在里面?

标签 c# unit-testing mvvm mstest

我正在使用 getter 和 setters() 测试 View 模型。它的基类是 ObservableObject 并且在 setter 中有 OnPropertyChanged() 。我不知道如何测试 setter 来验证值是否已设置以及 propertychanged 事件是否已引发。你能给我举个例子吗?

public class ViewModel : ObservableObject
{
    private Connection _connection;
       
    public string ConnectionName { get { return _connection.ConnectionName; } set { _connection.ConnectionName = value; OnPropertyChanged(); } }
          
    public ViewModel(Connection connection)
    {
        _connection = connection;
    }
}

以下是我测试从 INotifyPropertyChanged 派生的 ViewModel 的方法。

class GroupViewModel : INotifyPropertyChanged
{
    public GroupViewModel()
    {        
    }

    private ObservableCollection<Group> _groupList;

    public ObservableCollection<Group> GroupList
    {
        get { return _groupList; }

        set
        {
            _groupList = value;
            NotifyPropertyChanged("GroupList");
        }
    }

    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
public class GroupViewModelTests
{
    [TestMethod()]
    public void TestGroupList()
    {
        List<Group> listOfGroups = new List<Group>();
        Group Group = new Group();
        listOfGroups.Add(Group);

        bool didFire = false;
        GroupViewModel _viewModel = new GroupViewModel();
        ObservableCollection<Group> _groupList = new ObservableCollection<Group>(listOfGroups);

        _viewModel.PropertyChanged += (s, e) =>
        {
            didFire = true;
            Assert.AreEqual("GroupList", e.PropertyName);
            Assert.AreEqual(true, _viewModel.GroupList.Equals(_groupList));
        };

        _viewModel.GroupList = _groupList;
        Assert.IsTrue(didFire);
    }
}

最佳答案

最简单的方法是使用单元测试库,例如 FluentAssertions其中supports monitoring event raising .

例如,使用 FluentAssertions 就这么简单:

// ARRANGE

var subject          = new GroupViewModel();
var monitoredSubject = subject.Monitor();
var listOfGroups     = new List<Group>() { new() };
var groupList        = new ObservableCollection<Group>(listOfGroups);

// ACT

subject.GroupList = groupList;

// ASSERT

subject.GroupList.Should().Equal(groupList);

monitoredSubject.Should()
    .Raise("PropertyChanged")
    .WithSender(subject)
    .WithArgs<PropertyChangedEventArgs>(args => 
        args.PropertyName == nameof(GroupViewModel.GroupList));

请注意,FluentAssertions 可作为 NuGet 包使用。

关于c# - 如何使用 OnPropertyChanged() 对 setter 进行单元测试;在里面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76801516/

相关文章:

c# - 什么时候需要在图形上使用 dispose()?

java - 等待 JUnit 测试用例中测试的代码生成的所有线程

c# - 使用 MVVM 在 DataGrid 中级联 ComboBox

wpf - 将 View 模型与模型相结合

c# - 从 asp.net core 身份验证 Web 应用程序获取 Microsoft Graph 的访问 token

c# - 使用字符串插值将字符串格式化为列

c# - 使用 Entity Framework 的模型上的显示名称

unit-testing - 单元测试 os.File.Write 调用

unit-testing - 使用内存数据库进行测试。单元测试还是集成测试?

c# - 从collectionview获取过滤列表