问题描述
我有一个实现 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
问题在于 handler
是 EventHandler<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);
}
}