在Moq中调用回调

时间:2009-12-03 16:38:50

标签: unit-testing c#-3.0 moq mstest

我有一个执行异步服务调用的方法。我通过传递回调来调用这个类。

public void GetRights(EventHandler<GetRightsCompletedEventArgs> callback)
{
    ServiceClient client = new ServiceClient();
    client.GetRightsCompleted += new EventHandler<GetRightsCompletedEventArgs>(callback);
    client.GetRightsAsync();
}

GetRights(GetRightsCallback);

我正在使用MSTest创建测试,并且我在Moq中模拟了包含类(IGetRightsProxy)。在测试中调用此方法时,如何调用回调?

GetRightsForCurrentUserCompletedEventArgs results = 
    new GetRightsCompletedEventArgs(
    new object[] { new ObservableCollection<Right>()}, null, false, null);
Mock<IGetRightsProxy> MockIGetRightsProxy = new Mock<GetRightsProxy>();

2 个答案:

答案 0 :(得分:0)

实现我想要的一种方法是像这样扩展类:

class MockGetRightsProxy : IGetRightsProxy
{
    public void GetRights(EventHandler<GetRightsCompletedEventArgs> callback)
    {
        // Create some args here
        GetRightsCompletedEventArgs args = new GetRightsCompletedEventArgs(
            new object[] { new ObservableCollection<Right>() }, null, false, null);

        callback(null, args);
    }

}

我一直在寻找在Moq中调用回调的方法,但这也有效。

答案 1 :(得分:0)

您希望在模拟中查看Moq的Callback()扩展名;

Mock<IGetRightsProxy> mock = new Mock<IGetRightsProxy>();
mock.Setup(x => x.GetRights(It.IsAny<EventHandler<GetRightsCompletedEventArgs>>())
  .Callback<EventHandler<GetRightsCompletedEventArgs>>(
    callback => callback(mock.Object, new GetRightsCompletedEventArgs())
  );

当被测代码在GetRights()模拟器上调用IGetRightsProxy时,它传入的实际EventHandler<GetRightsCompletedEventArgs>将随后传递到Moq的Callback()方法。

注意:类型推断将适用于应用于Callback()的泛型,但我发现在这些情况下,显式定义传递给方法的类型更具可读性。