.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
相关产品推荐
相关产品推荐

