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

无法Mock Azure.Blob.Storage的BlobBaseClient.CanGenerateSasUri,求绕过方案

Azure Blob Client CanGenerateSasUri属性无法Mock的绕过方案

方案1:添加抽象包装层(最推荐,长期可维护)

该方案不依赖SDK版本更新,完全解耦业务代码和Azure SDK实现,后续SDK迭代不会影响测试逻辑。

  • 首先定义包装接口,提取业务中用到的BlobClient相关成员:
public interface IBlobClientWrapper
{
    bool CanGenerateSasUri { get; }
    Uri GenerateSasUri(BlobSasBuilder builder);
    // 其他用到的BlobClient方法/属性按需添加即可
}
  • 实现对应包装类:
public class BlobClientWrapper : IBlobClientWrapper
{
    private readonly BlobClient _innerBlobClient;
    public BlobClientWrapper(BlobClient innerBlobClient)
    {
        _innerBlobClient = innerBlobClient;
    }
    public bool CanGenerateSasUri => _innerBlobClient.CanGenerateSasUri;
    public Uri GenerateSasUri(BlobSasBuilder builder) => _innerBlobClient.GenerateSasUri(builder);
}
  • 业务代码中将直接引用BlobClient的地方替换为IBlobClientWrapper,测试时直接Mock该接口即可:
var mockBlobWrapper = new Mock<IBlobClientWrapper>();
mockBlobWrapper.SetupGet(x => x.CanGenerateSasUri).Returns(true);

方案2:使用SDK预发布版本

对应修复已经合并到SDK主分支,仅未同步到12.8.4正式稳定版,可在Nuget包管理器中勾选「包含预发布版本」,安装更高版本的Azure.Storage.Blobs包,该版本中CanGenerateSasUri已改为虚属性,可直接用Moq正常Mock。

方案3:构造真实BlobClient实例绕开Mock

如果不想修改现有代码结构,可以直接构造满足CanGenerateSasUri返回条件的真实BlobClient实例,无需Mock:

  • 传入SharedKeyCredential构造BlobClient,此时CanGenerateSasUri天然返回true:
var url = new Uri("http://bogus:10000/devstoreaccount1/MyContainer/Blob.mp3");
// 开发存储默认账号密钥
var credential = new StorageSharedKeyCredential("devstoreaccount1", "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==");
var blobClient = new BlobClient(url, credential);
// 此时blobClient.CanGenerateSasUri直接返回true,无需Mock配置

内容的提问来源于stack exchange,提问作者Kishan Vaishnav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 14:09:05