在 Moq 中调用回调

发布于 2024-08-13 12:46:52 字数 709 浏览 2 评论 0原文

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

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

I have a method that performs an asynchronous service call. I call this class by passing in the callback.

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

GetRights(GetRightsCallback);

I'm creating tests with MSTest, and I've mocked the containing class (IGetRightsProxy) in Moq. How can I invoke the callback when this method is called in the test?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

猫性小仙女 2024-08-20 12:46:53

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

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

One way of doing what I want is to extend the class like this:

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

}

I was looking for ways to invoke the callback in Moq, but this works, too.

无语# 2024-08-20 12:46:53

您想在您的模拟中查看 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 随后将被传递到 Moq 的 < code>Callback() 方法。

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

You want to be looking at Moq's Callback() extension on your mock;

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

When the code under test calls GetRights() on the IGetRightsProxy mock the actual EventHandler<GetRightsCompletedEventArgs> it passes in will subsequently be passed into Moq's Callback() method.

Note: Type inference will work on the generic applied to Callback() but I find in these cases it is a bit more readable to explicitly define the type being passed into the method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文