如何设置moq模拟以引发在接口实现中定义的事件而不是接口本身?

时间:2016-11-17 02:35:22

标签: c# unit-testing moq

要模拟的代码如下所示:

class Foo : IBar
{
    public virtual event EventHandler FooEventHandler;

    void FooMethod()
    {
        // blah, blah, blah...
    }

    void IBar.BarMethod()
    {
        this.FooEventHandler?.Invoke(this, new EventArgs()); 
    }
}

interface IBar 
{
    void BarMethod();
}

我想模仿Foo及其对IBar的实现,以便我可以将它交给受测试的主题并断言。要求告诉我,我不允许将事件处理程序放在IBar界面上,因此the explanation behind this link似乎不适合我。

1 个答案:

答案 0 :(得分:0)

编辑:

我试图在这里增加清晰度,但我不确定它是否有效。

使用Mock.As<T>()方法可以创建一个遵循多个接口的模拟。由于要求事件签名不能存在于IBar接口上,我正在模拟具体的Foo类,然后使用IBar.As<IBar>()分配给模拟。 .As<IBar>的返回允许我设置.BarMethod()以使用.Raises(...)方法在模拟IBar上接受lambda表达式来引发事件。在此表达式中,使用.As<Foo>()允许使用设置IBar的上下文访问返回虚拟事件处理程序上的虚拟事件处理程序。

var foo = new Mock<Foo>();
foo.As<IBar>()
   .Setup(bar => bar.BarMethod())
   .Raises(bar => bar.As<Foo>().FooEventHandler += null, new EventArgs());