如何在单元测试中模拟Graph API的Microsoft.Graph.ServiceException?
模拟Graph API调用抛出ServiceException的单元测试写法
要在单元测试里模拟Graph API调用抛出Microsoft.Graph.ServiceException,只需要把你原来用ReturnsAsync返回正常结果的逻辑,改成用ThrowsAsync抛出构造好的ServiceException实例就行。
具体实现代码
你可以单独写一个方法来模拟异常场景,也可以在原方法里加分支判断。以下是单独实现的示例:
public static void SetupMockServiceException(Mock<IRequestAdapter> mockRequestAdapter, string value) { // 构造Graph API返回的错误响应对象 var errorResponse = new ErrorResponse { Error = new Error { Code = "InvalidRequest", // 自定义错误码,比如资源不存在用"ResourceNotFound" Message = "无效的主机ID", Details = new List<ErrorDetail> { new ErrorDetail { Message = "提供的host%2Did参数格式不正确" } } } }; // 设置Moq模拟抛出ServiceException mockRequestAdapter.Setup( adapter => adapter.SendAsync(It.Is<RequestInformation>( ri => (string)ri.PathParameters["host%2Did"] == value ), Microsoft.Graph.Models.Security.HostReputation.CreateFromDiscriminatorValue, It.IsAny<Dictionary<string, ParsableFactory<IParsable>>>(), It.IsAny<CancellationToken>()) ).ThrowsAsync(new ServiceException(errorResponse)); }
关键说明
- 替换核心逻辑:把原来的
ReturnsAsync(host)改成ThrowsAsync(new ServiceException(errorResponse)),用抛出异常替代返回正常结果。 - 自定义错误内容:
ErrorResponse和Error对象可以根据测试场景调整,比如模拟权限不足就把Code设为Authorization_RequestDenied,模拟资源不存在设为ResourceNotFound,错误消息也可以对应修改。 - 保持匹配条件:原代码里对
RequestInformation的路径参数判断逻辑可以保留,确保只在特定请求场景下抛出异常。
内容的提问来源于stack exchange,提问作者Punter Vicky
相关产品推荐
相关产品推荐

