如何在MSTest V3(.NET 8)中忽略被测方法抛出的异常?
在MSTest V3(.NET 8)中仅测试日志功能,忽略方法抛出的异常
针对你提到的场景——只想验证ContrivedNetworkRequest方法在请求失败时是否正确记录警告日志,无需处理后续抛出的异常——完全可以实现,核心思路是模拟失败请求触发日志、捕获并忽略最终的异常、专注验证日志行为。
具体实现步骤
模拟依赖项:
- 用Moq模拟
HttpClient,让它的GetAsync方法每次都返回失败响应,确保方法会进入日志记录分支。 - 用Moq模拟
ILogger<IContrived>,用于捕获日志输出。
- 用Moq模拟
执行被测方法并忽略异常:
在调用被测方法时,通过try-catch捕获最终抛出的ContrivedException,避免测试因未处理异常而失败。验证日志行为:
用Moq的Verify方法检查日志是否被正确调用了指定次数和内容。
完整测试代码示例
using Microsoft.Extensions.Logging; using Moq; using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; [TestClass] public class ContrivedTests { [TestMethod] public async Task ContrivedNetworkRequest_WhenAllRequestsFail_LogsThreeWarnings() { // 模拟HttpClient,每次返回失败响应 var httpClientMock = new Mock<HttpClient>(); httpClientMock.Setup(client => client.GetAsync( It.IsAny<string>(), It.IsAny<CancellationToken>())) .ReturnsAsync(new HttpResponseMessage(HttpStatusCode.BadRequest)); // 模拟Logger var loggerMock = new Mock<ILogger<IContrived>>(); // 实例化被测类(替换为实际包含ContrivedNetworkRequest方法的类) var contrivedService = new ContrivedService(); try { // 执行被测方法,捕获异常避免测试失败 await contrivedService.ContrivedNetworkRequest(loggerMock.Object, httpClientMock.Object); } catch (ContrivedException) { // 忽略异常,专注日志验证 } // 验证日志:确认LogWarning被调用3次,内容为"Warning!" loggerMock.Verify( logger => logger.LogWarning( It.IsAny<EventId>(), It.IsAny<Exception>(), It.Is<string>(message => message == "Warning!"), It.IsAny<object[]>()), Times.Exactly(3)); } } // 补充被测类、接口和异常类的定义(仅用于测试示例) public class ContrivedService : IContrived { public async Task<HttpResponseMessage> ContrivedNetworkRequest(ILogger<IContrived> logger, HttpClient client) { for (var i = 0; i < 3; i++) { var response = await client.GetAsync("http://example.com"); if (response.IsSuccessStatusCode) return response; logger.LogWarning("Warning!"); } throw new ContrivedException("Error!"); } } public interface IContrived { } public class ContrivedException : Exception { public ContrivedException(string message) : base(message) { } }
关键说明
- 模拟
HttpClient返回失败响应是核心,确保方法会循环三次并记录三次警告日志。 try-catch块仅捕获目标异常,避免测试因未处理异常失败,同时完全不涉及异常断言逻辑,符合“仅关注日志”的需求。- 通过Moq的
Verify方法精准验证日志的调用次数和内容,确保日志行为符合预期。
内容的提问来源于stack exchange,提问作者user1393477
相关产品推荐
相关产品推荐

