0

0

.NET怎么做集成测试 WebApplicationFactory使用教程

煙雲

煙雲

发布时间:2025-12-21 13:06:08

|

283人浏览过

|

来源于php中文网

原创

WebApplicationFactory 是 .NET 集成测试核心工具,支持内存中轻量应用启动、自定义服务配置、模拟认证及隔离清理。一、继承并调用 CreateClient;二、重写 ConfigureWebHost 替换服务;三、通过 AddScheme 注册测试认证方案;四、配合 IClassFixture 管理生命周期并确保数据库等资源隔离。

.net怎么做集成测试 webapplicationfactory使用教程

WebApplicationFactory 是 .NET 集成测试的核心工具,它能启动一个轻量、内存中的测试版 Web 应用,不依赖真实 IIS 或 Kestrel,也不需要端口占用或进程管理,特别适合验证控制器逻辑、中间件行为、依赖注入配置和端到端 HTTP 流程。

一、基础用法:创建并使用 WebApplicationFactory

在测试项目中安装 Microsoft.AspNetCore.Mvc.Testing NuGet 包(.NET 5+ 已内置,但建议显式引用)。

假设你的主项目叫 MyApp.Web,其程序入口是 Program.cs(Minimal Hosting Model)或 Startup.cs(传统模型),则测试类可这样写:

  • 继承 WebApplicationFactory(Minimal 模型)或 WebApplicationFactory(传统模型)
  • 通过 CreateClient() 获取 HttpClient,它自动指向内存中运行的应用
  • 无需手动启动/停止应用,工厂会在测试前后自动处理生命周期

示例:

[Fact]
public async Task GetHome_ReturnsSuccess()
{
    var factory = new WebApplicationFactory();
    var client = factory.CreateClient();
    var response = await client.GetAsync("/");
    response.EnsureSuccessStatusCode();
}

二、自定义应用配置:重写 CreateWebHostBuilder 或 ConfigureWebHost

默认情况下,WebApplicationFactory 会复用你主项目的宿主配置。但测试时往往需要替换服务(如用内存数据库代替 SQL Server)、跳过认证、或注入 Mock 对象。

推荐方式是重写 ConfigureWebHost 方法:

  • 调用 builder.ConfigureServices(services => { ... }) 替换或新增服务
  • 调用 builder.UseEnvironment("Testing") 切换环境,配合 IWebHostEnvironment 做条件注册
  • 避免修改 Program.cs 主逻辑,所有测试定制都收束在测试类内部

常见替换示例(用 InMemoryDatabase):

ClipDrop
ClipDrop

Stability.AI出品的图片处理系列工具(背景移除、图片放大、打光)

下载
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
    builder.ConfigureServices(services =>
    {
        services.RemoveAll(typeof(DbContextOptions));
        services.AddDbContext(options =>
            options.UseInMemoryDatabase("TestDb"));
    });
}

三、处理认证与用户上下文

如果控制器有 [Authorize] 特性,直接发请求会返回 401。解决方法不是关掉认证,而是模拟已登录用户:

  • ClaimsPrincipal 构造测试用户,并通过 client.DefaultRequestHeaders.Authorization 设置 Bearer Token(需配合测试 JWT 签发)
  • 更轻量的方式:在 ConfigureWebHost 中注册一个测试用的 IAuthenticationService 或直接替换 IHttpContextAccessor(不推荐)
  • 推荐做法:使用 AddAuthentication().AddScheme 注册一个仅用于测试的认证方案,在 handler 中直接返回成功 principal

简化版(无 Token 验证,纯模拟):

builder.ConfigureServices(services =>
{
    services.AddAuthentication("Test")
        .AddScheme("Test", _ => { });
});
// 在 TestAuthHandler.HandleAuthenticateAsync 中 return AuthenticateResult.Success(ticket);

四、清理与复用:避免测试间干扰

每个 WebApplicationFactory 实例默认是隔离的,但若多个测试共用一个实例(比如用 [Collection] 共享工厂),要注意:

  • 数据库 InMemory 实例默认是静态的,跨测试会残留数据 → 改用带唯一名称的 UseInMemoryDatabase("TestDb_" + Guid.NewGuid())
  • 缓存、静态字段、单例服务状态可能污染后续测试 → 在 Dispose 或每个测试开头重置关键状态
  • 不需要手动调用 Dispose(),xUnit 的 IClassFixture 会自动管理工厂生命周期

推荐结构(共享工厂 + 隔离数据库):

public class IntegrationTest : IClassFixture>
{
    private readonly WebApplicationFactory _factory;
    public IntegrationTest(WebApplicationFactory factory) => _factory = factory;
    // 后续测试方法中每次新建 client 即可
}

基本上就这些。WebApplicationFactory 不复杂但容易忽略环境隔离和依赖替换细节。把配置收在 ConfigureWebHost 里,坚持“测试即真实请求”,集成测试就能稳稳跑起来。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

682

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

347

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

676

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

575

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

416

2024.04.29

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 47.6万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号