Moq接口与Action属性

时间:2015-10-23 16:22:54

标签: unit-testing moq

我目前正在使用框架Fleck,我想模拟界面 Bitmap bmp = new Bitmap(path); MemoryStream ms = new MemoryStream(); bmp.Save(ms, ImageFormat.Bmp); byte[] result = ms.ToArray(); 。它有一些IWebSocketConnection类型的属性,我想提升这些事件

到目前为止,我没有成功将其提升为像这样的事件:

Action

甚至可以像这样直接调用它:

fleckInterfaceMock.Raise(mock => mock.OnClose += null);

我在official documentation

上找不到任何有趣的内容

界面:

fleckInterfaceMock.Object.OnClose();

1 个答案:

答案 0 :(得分:1)

请注意,OnClose和界面中的其他成员实际上不是事件。它们实际上是get - set属性,其属性类型恰好是委托类型。

出于这个原因,我认为你不能或不会使用Moq的Raise

如果您想要调用:

// desired use
fleckInterfaceMock.Object.OnClose();

要成功,需要get访问者返回非空Action

你可以这样做:

// possible Moq setup
Action a = () => { Console.WriteLine("Testing OnClose."); };
fleckInterfaceMock.Setup(x => x.OnClose).Returns(a);

如果您想要类型的委托组合(这不是真正的事件订阅;我们没有事件):

// desired use
fleckInterfaceMock.Object.OnClose += someAction;

要成功,模拟必须首先容忍get属性,就像之前一样,其次它必须容忍你set属性(它将set到& #34;总和"(1)get和(2)someAction返回的内容。

您可以通过多种方式实现这一目标。一种方法很简单:

// possible Moq setup
fleckInterfaceMock.SetupProperty(x => x.OnClose);

只需将OnClose转换为允许getset的属性,并且会记住set的内容,并在{get时返回该值1}}被称为。