如何在FakeItEasy中针对基于自定义委托的事件引发事件?

6
我正在测试的应用程序中有很多基于自定义委托的事件,例如这个:

public delegate void NameChangedHandler(string name);
public event NameChanged OnNameChanged;
...
public void ChangeYourName(string newName)
{
    if( NameChanged != null )
        NameChanged(newName);
}

我希望能够模拟生成这些事件的类,并将这些事件引发到正在测试的类中。
我知道FakeItEasy可以使用Raise.With()来引发传统事件签名MyHandler(object sender, EventArgs e)MyHandler(EventArgs e)的事件,但我不知道在我的情况下该怎么做。
有什么想法吗?

我今天也遇到了完全相同的问题。有人可以帮忙吗? - jdscolam
1
我认为答案是FakeItEasy无法做到这一点。我的解决方案是重构我的事件以接受EventArgs。 - pduncan
1
这个问题已经在 https://github.com/FakeItEasy/FakeItEasy/issues/30 上提出。 - Adam Ralph
2个回答

3
截至FakeItEasy 2.0.0版本,现在已经可以实现这一点。 引发事件文档主题中有完整的故事,但要点是您将使用
fake.OnNameChanged += Raise.With<NameChanged>(newName);

一如既往,活动必须是虚拟的。


0

你可以将 ChangeYourName 声明为虚方法并替换该方法。

A.CallsTo(()=>fakeClass.ChangeyourName(A<string>._)).Invokes((x)=>invokeMockEvent(x));

如果这不是你想要的,我想如果ChangeYourName是公共的,你可以创建一个假类。

var class = new Class();
class.OnNameChanged += (x)=>
{
    Assert.AreEqual(x,"tim");
};

class.ChangeYourName("tim");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接