Mock TableClient.DeleteEntityAsync时如何设置响应StatusCode与Content
配置Mock的Response对象的StatusCode与Content属性
Azure.Response的StatusCode对应类中的抽象属性Status,和Content属性一样,都没有公开可写的setter,无法直接给属性赋值,需要通过Moq框架的属性配置逻辑指定返回值。
常规Moq配置方式
Azure Table服务删除实体成功的标准返回为HTTP 204 No Content,响应无返回体,完整实现代码如下:
using Azure; using Azure.Data.Tables; using Moq; using System.Net; using System.Threading; using System.Threading.Tasks; // 初始化响应Mock实例 var mockResponse = new Mock<Response>(); // 配置状态码为204,代表删除成功 mockResponse.SetupGet(resp => resp.Status).Returns((int)HttpStatusCode.NoContent); // 配置响应内容为空,匹配204响应无返回内容的特性 mockResponse.SetupGet(resp => resp.Content).Returns(BinaryData.FromString(string.Empty)); // 配置TableClient的DeleteEntityAsync方法Mock逻辑 Mock<TableClient> tableClient = new Mock<TableClient>(); tableClient.Setup(client => client.DeleteEntityAsync( It.IsAny<string>(), It.IsAny<string>(), It.IsAny<ETag>(), It.IsAny<CancellationToken>())) .ReturnsAsync(mockResponse.Object);
如果要模拟其他业务场景,比如实体不存在(404)、版本冲突(409),只需要修改Status的返回值为对应HTTP状态码,在Content中填入对应格式的响应内容即可。
简化实现方式
高版本Azure SDK提供了内置的响应构造静态方法,不需要单独Mock Response对象,可以直接生成符合要求的响应实例返回,代码更简洁:
Mock<TableClient> tableClient = new Mock<TableClient>(); tableClient.Setup(client => client.DeleteEntityAsync( It.IsAny<string>(), It.IsAny<string>(), It.IsAny<ETag>(), It.IsAny<CancellationToken>())) .ReturnsAsync(Response.CompletedWithStatus( status: (int)HttpStatusCode.NoContent, content: BinaryData.FromString(string.Empty)));
内容的提问来源于stack exchange,提问作者Markus Meyer
相关产品推荐
相关产品推荐

