C#使用fakeiteasy在假对象上使用自定义委托类型引发事件

时间:2016-03-16 16:45:46

标签: c# unit-testing fakeiteasy

根据假冒的文件,我所要做的就是:

public delegate void CustomEventHandler(object sender, CustomEventArgs e);

event CustomEventHandler CustomEvent;

fake.CustomEvent += Raise.With<CustomEventHandler>(fake, sampleCustomEventArgs);

我在我的代码中尝试了以下内容:

public delegate void RowStateHandler(object sender, RowStateHandlerArgs e);
public class RowStateHandlerArgs : EventArgs
{
    public bool Selected { get; set; }
    public string CampaignId { get; set; }
}

... 视图的界面:

public interface ICampaignChannelView
{
     event RowStateHandler RowStateChanged;
}

我的单元测试中的片段:

ICampaignChannelView v = A.Fake<ICampaignChannelView>();
RowStateHandlerArgs args = new RowStateHandlerArgs() {CampaignId = "1", Selected = true};
v.RowStateChanged += Raise.With<RowStateHandler>(v, args);

我得到以下编译错误:

Error   CS0029  Cannot implicitly convert type
FakeItEasy.Raise<Add_in.UI.Wizard.RowStateHandler> to
Add_in.UI.Wizard.RowStateHandler    Add-inTests C:\..\WizardPresenterTests.cs

  

错误CS1503参数2:无法转换   'add_in.UI.Wizard.RowStateHandlerArgs'到   'add_in.UI.Wizard.RowStateHandler'Add-inTests C:.. \ WizardPresenterTests.cs

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

听起来你使用的是旧版本的FakeItEasy而不是文档所指的。 Raising Events documentation page有两种口味。一个用于FakeItEasy 1.x,另一个用于2.x

  

更新:文档已经moved to readthedocs,它有一个更好的系统来维护不同版本的文档。)

我刚刚检查了两个页面并使用您的代码构建了两个测试项目。我最后改变的唯一一条是

 v.RowStateChanged += Raise.With<RowStateHandler>(v, args);

在FakeItEasy 1.25.3下,此调用有效:

v.RowStateChanged += Raise.With(v, args).Now;

在FakeItEasy 2.0.0下,此调用有效:

v.RowStateChanged += Raise.With<RowStateHandler>(v, args);