我正在使用 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/