无法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
相关产品推荐
相关产品推荐

