【问题标题】:Invoke callback in Moq在 Moq 中调用回调
【发布时间】:2023-04-01 02:50:01
【问题描述】:

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

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

【问题讨论】:

  • 不太清楚您要完成什么。如果我正确理解代码,ServiceClient 将调用回调,因此您不应该通过 Moq 从测试中执行此操作。

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


【解决方案1】:

我想做的一种方法是像这样扩展类:

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 中调用回调的方法,但这也有效。

【讨论】:

    【解决方案2】:

    您想在模拟中查看 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 模拟上调用GetRights() 时,它传入的实际EventHandler&lt;GetRightsCompletedEventArgs&gt; 随后将被传递到Moq 的Callback() 方法中。

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

    【讨论】:

      猜你喜欢
      • 2015-11-19
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      相关资源
      最近更新 更多