You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用默认构造函数Mock Azure.Messaging.WebPubSub.WebPubSubServiceClient?

如何Mock WebPubSubServiceClient并模拟GetClientAccessUriAsync方法

核心逻辑

WebPubSubServiceClient的无参构造函数是专门为测试场景设计的,结合Mock框架(比如Moq)就能直接Mock这个类——前提是GetClientAccessUriAsync是虚方法,而Azure SDK里的这个方法恰好满足这个条件。

具体实现(以Moq为例)

  1. 安装Moq依赖
    先确保项目里装了Moq NuGet包:

    Install-Package Moq
    

    或者用.NET CLI:

    dotnet add package Moq
    
  2. Mock类并预设方法返回值
    直接创建WebPubSubServiceClient的Mock实例,然后指定GetClientAccessUriAsync的响应结果:

    using Moq;
    using Azure.Messaging.WebPubSub;
    using System.Threading.Tasks;
    
    // 创建Mock实例
    var mockWebPubSubClient = new Mock<WebPubSubServiceClient>();
    
    // 预设GetClientAccessUriAsync的返回值
    var testAccessUri = new Uri("wss://mock-webpubsub.example.com/client/hubs/test-hub");
    mockWebPubSubClient.Setup(client => client.GetClientAccessUriAsync(
        It.IsAny<string>(),          // 匹配任意Hub名称
        It.IsAny<TimeSpan?>(),       // 匹配任意过期时间
        It.IsAny<string>(),          // 匹配任意用户ID
        It.IsAny<IEnumerable<string>>(), // 匹配任意角色列表
        It.IsAny<CancellationToken>()    // 匹配任意取消令牌
    )).ReturnsAsync(testAccessUri);
    
    // 获取Mock后的实例用于测试
    WebPubSubServiceClient clientUnderTest = mockWebPubSubClient.Object;
    
    // 调用方法验证结果
    var result = await clientUnderTest.GetClientAccessUriAsync("test-hub");
    // result会等于预设的testAccessUri
    
  3. 精准匹配特定参数(可选)
    如果需要针对特定参数返回不同结果,可以把It.IsAny<T>替换为具体的匹配条件:

    mockWebPubSubClient.Setup(client => client.GetClientAccessUriAsync(
        "user-hub",                  // 仅匹配Hub名为"user-hub"的调用
        TimeSpan.FromMinutes(30),    // 仅匹配过期时间30分钟的调用
        "user_001",
        It.Is<IEnumerable<string>>(roles => roles.Contains("viewer")),
        It.IsAny<CancellationToken>()
    )).ReturnsAsync(new Uri("wss://mock-webpubsub.example.com/client/hubs/user-hub?user=user_001"));
    

注意点

  • 确认GetClientAccessUriAsync是虚方法:Azure SDK的服务客户端方法基本都设计为虚方法,这也是无参构造函数能用于Mock的基础。
  • 换用其他Mock框架(比如NSubstitute)逻辑类似:创建类的Mock实例,设置虚方法的返回值即可。

内容的提问来源于stack exchange,提问作者Simon K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 04:46:14