使用 Moq 库模拟 IEventGridClient

匿名
2024-03-29T06:12:29.91+00:00

我正在尝试使用 Moq 库模拟 Microsoft.Azure.EventGrid NuGet 包中的 IEventGridClient,以进行单元测试。

Mock<IEventGridClient> client = new();

client.Setup(x 
 => x.PublishEventsAsync(It.IsAny<string>(),
 It.IsAny<List<EventGridEvent>>(), 
 default))
 .Returns(Task.CompletedTask);

但是,在调用安装程序时,我得到以下异常:

    System.NotSupportedException : Unsupported expression: x => x.PublishEventsAsync(It.IsAny<string>(), It.IsAny<List<EventGridEvent>>(), CancellationToken)
    Extension methods (here: EventGridClientExtensions.PublishEventsAsync) may not be used in setup / verification expressions.
  Stack Trace: 
    Guard.IsOverridable(MethodInfo method, Expression expression) line 87
    InvocationShape.ctor(LambdaExpression expression, MethodInfo method, IReadOnlyList`1 arguments, Boolean exactGenericTypeArguments, Boolean skipMatcherInitialization, Boolean allowNonOverridable) line 84
    ExpressionExtensions.<Split>g__Split|5_0(Expression e, Expression& r, InvocationShape& p, Boolean assignment, Boolean allowNonOverridableLastProperty) line 234
    ExpressionExtensions.Split(LambdaExpression expression, Boolean allowNonOverridableLastProperty) line 149
    Mock.SetupRecursive[TSetup](Mock mock, LambdaExpression expression, Func`4 setupLast, Boolean allowNonOverridableLastProperty) line 606
    Mock.Setup(Mock mock, LambdaExpression expression, Condition condition) line 510
    Mock`1.Setup[TResult](Expression`1 expression) line 468
    UnitTests.ShouldStopAppOnSqlExceptionWhenDeltaEventIsNull() line 25
    --- End of stack trace from previous location ---

使用 Microsoft.Azure.EventGrid SDK 进行单元测试的推荐方法是什么。目前,我已经围绕 EventGridClient 编写了一个包装类,但我认为这是不必要的,因为该类已经实现了一个接口 IEventGridClient。

感谢任何指导.

Note:此问题总结整理于: Mocking IEventGridClient using the Moq library

开发人员技术 | C#
开发人员技术 | C#
一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。
0 个注释 无注释
{count} 票

Answer accepted by question author
  1. Hui Liu-MSFT 48,706 信誉分 Microsoft 外部员工
    2024-03-29T07:38:33.09+00:00

    恐怕,您不能直接模拟它,因为 PublishEventsAsync 是 IEventGridClient 的扩展方法,但您应该能够模拟 IEventGridClient 的 PublishEventsWithHttpMessages 方法。

    请参考:https://learn.microsoft.com/dotnet/api/microsoft.azure.eventgrid.ieventgridclient.publisheventswithhttpmessagesasync

    简而言之,如果您模拟 PublishEventsWithHttpMessagesAsync,则扩展方法 PublishEventsAsync 将得到处理,因为 PublishEventsAsync 在internally调用 PublishEventsWithHttpMessagesAsync。

    您的实际代码仍然可以使用 PublishEventsAsync,这只是单元测试中的嘲笑技巧。

    client.Setup(x  
      => x.PublishEventsWithHttpMessagesAsync(It.IsAny<string>(),  
      It.IsAny<IList<EventGridEvent>>(),  
      It.IsAny<Dictionary<List<string>>>(),  
      It.IsAny<CancellationToken >()))  
      .ReturnsAsync(new AzureOperationResponse());
    

    请让我知道这可不可以帮你。


    如果回复有帮助,请点击“接受答案”并点赞。

    注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。

    1 个人认为此答案很有帮助。
    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。