如何使用 XUnit 提高 NotifyCollectionChangedEventArgs

问题描述

我有一个实现 INotifyCollectionChanged 的类,我想测试是否为特定场景引发了 CollectionChanged 事件。

我已经尝试了下面的代码,但我遇到了编译器错误,到目前为止我找不到解决方案。

[Fact]  
public void RaiSEOnAddition()
{
  Action addition = () => Collection["new key"] = 3;

  Assert.Raises<NotifyCollectionChangedEventArgs>(
    handler => Collection.CollectionChanged += handler,// compiler error
    handler => Collection.CollectionChanged -= handler,// compiler error
    addition);
}

不能隐式转换类型 'System.EventHandler' 到 'System.Collections.Specialized.NotifyCollectionChangedEventHandler'

问题在于 handlerEventHandler<NotifyCollectionChangedEventArgs>,我想要一个 NotifyCollectionChangedEventHandler<NotifyCollectionChangedEventArgs>

注意:有一个特定的函数可以测试 PropertyChanged (Assert.PropertyChanged) 但不是用于 CollectionChanged

解决方法

我想除了做这样的事情别无选择,

[Fact]  
public void RaiseOnAddition()
{
  var timesRaised = 0;

  NotifyCollectionChangedEventHandler handler += () => ++timesRaised;

  Collection["new key"] = 3;

  Assert.Equals(1,timesRaised);

  NotifyCollectionChangedEventHandler handler -= () => ++timesRaised;
}
,
public class TestClass : INotifyCollectionChanged
{
  public event NotifyCollectionChangedEventHandler? CollectionChanged;

  public void RaiseCollectionChanged()
  {
    CollectionChanged?.Invoke(this,new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
  }
}
public class TestClassTests
{
  [Fact]
  public void RaiseOnAddition()
  {
    var counter = 0;
    var testee = new TestClass();
    testee.CollectionChanged += (s,e) => counter++;
    testee.RaiseCollectionChanged();
    testee.RaiseCollectionChanged();
    Assert.Equal(2,counter);
  }
}