在Moq中调用回调

问题描述:

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

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>(); 
+1

这是不是很清楚你试图完成什么。如果我正确理解代码,ServiceClient将调用回调函数,所以这不是你应该通过Moq进行的测试。 – 2009-12-03 18:03:05

一种方式是扩展类是这样的:

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的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()) 
); 

当被测代码调用IGetRightsProxy模拟实际EventHandler<GetRightsCompletedEventArgs>GetRights()它通过将随后被传递到起订量的Callback()方法。

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