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

.Net Core Startup类Configure方法单元测试报错求助

解决Startup.Configure单元测试中UseSwagger()的ArgumentNullException问题

你遇到的ArgumentNullException(提示“Value cannot be null. (Parameter 'provider')”),是因为UseSwagger()需要从应用程序服务容器中获取ISwaggerProvider依赖,但测试里构建的IApplicationBuilder没有关联有效的服务提供器(IServiceProvider)。下面是具体解决步骤:

1. Mock必要的依赖服务

用Moq框架MockISwaggerProvider和IServiceProvider,确保服务提供器能正确返回Swagger服务实例:

var swaggerProviderMock = new Mock<ISwaggerProvider>();
// 模拟GetSwagger方法的返回值,避免后续调用报错
swaggerProviderMock.Setup(p => p.GetSwagger(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
                   .Returns(new OpenApiDocument());

var serviceProviderMock = new Mock<IServiceProvider>();
// 配置服务提供器,请求ISwaggerProvider时返回Mock实例
serviceProviderMock.Setup(sp => sp.GetService(typeof(ISwaggerProvider)))
                   .Returns(swaggerProviderMock.Object);

2. 构建正确的IApplicationBuilder实例

使用ApplicationBuilder的构造函数,传入Mock的服务提供器,这样构建的应用程序构建器就能获取到Swagger所需的依赖:

var appBuilder = new ApplicationBuilder(serviceProviderMock.Object);

3. 完整测试代码示例

假设你的Startup类Configure方法如下:

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.UseSwagger();
        // 其他中间件配置逻辑
    }
}

对应的xUnit+Moq测试代码:

using Xunit;
using Moq;
using Microsoft.AspNetCore.Builder;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.Swagger;

public class StartupTests
{
    [Fact]
    public void Configure_AddsSwaggerMiddlewareSuccessfully()
    {
        // Arrange
        var swaggerProviderMock = new Mock<ISwaggerProvider>();
        swaggerProviderMock.Setup(p => p.GetSwagger(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
                           .Returns(new OpenApiDocument());

        var serviceProviderMock = new Mock<IServiceProvider>();
        serviceProviderMock.Setup(sp => sp.GetService(typeof(ISwaggerProvider)))
                           .Returns(swaggerProviderMock.Object);

        var appBuilder = new ApplicationBuilder(serviceProviderMock.Object);
        var startup = new Startup();

        // Act
        startup.Configure(appBuilder);

        // Assert
        // 可根据需求验证中间件是否添加成功,或验证Swagger服务的调用情况
        swaggerProviderMock.Verify(p => p.GetSwagger(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Never);
    }
}

额外提示

如果你的Configure方法还依赖其他参数(比如IWebHostEnvironment、ILogger<Startup>等),需要在测试时同样Mock这些参数并传入方法;若后续其他中间件也报类似的空引用异常,按照相同思路Mock对应的服务类型即可。

内容的提问来源于stack exchange,提问作者Hrd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:57:29