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

如何在MSTest V3(.NET 8)中忽略被测方法抛出的异常?

在MSTest V3(.NET 8)中仅测试日志功能,忽略方法抛出的异常

针对你提到的场景——只想验证ContrivedNetworkRequest方法在请求失败时是否正确记录警告日志,无需处理后续抛出的异常——完全可以实现,核心思路是模拟失败请求触发日志、捕获并忽略最终的异常、专注验证日志行为。

具体实现步骤

  1. 模拟依赖项:

    • 用Moq模拟HttpClient,让它的GetAsync方法每次都返回失败响应,确保方法会进入日志记录分支。
    • 用Moq模拟ILogger<IContrived>,用于捕获日志输出。
  2. 执行被测方法并忽略异常:
    在调用被测方法时,通过try-catch捕获最终抛出的ContrivedException,避免测试因未处理异常而失败。

  3. 验证日志行为:
    用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:57:09