要模拟的代码如下所示:
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似乎不适合我。
答案 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());