在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>();
答
一种方式是扩展类是这样的:
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()
的泛型,但我发现在这些情况下,显式定义传入该方法的类型会更易读。
这是不是很清楚你试图完成什么。如果我正确理解代码,ServiceClient将调用回调函数,所以这不是你应该通过Moq进行的测试。 – 2009-12-03 18:03:05