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

如何在Abp Framework中为HttpApi Rest Api搭建集成测试项目

ABP Framework无UI HttpApi项目集成测试方案

一、通过ABP CLI生成集成测试项目

ABP CLI支持给已有项目添加测试相关模块,你可以在解决方案根目录执行以下命令:

abp add-module Volo.Abp.TestBase --with-source-code
abp add-package Volo.Abp.AspNetCore.TestBase

之后直接生成集成测试项目并加入解决方案:

abp new YourProjectName.Tests --template module --no-ui --add-to-solution YourSolutionName.sln

生成后需手动调整测试项目的引用,确保其依赖你的HttpApi项目及相关核心模块。

二、手动创建集成测试项目步骤

  1. 新建测试项目:在解决方案中创建xUnit(或NUnit)类库项目,命名建议为YourProject.HttpApi.Tests
  2. 安装依赖包:通过NuGet安装以下必备包:
    • Volo.Abp.AspNetCore.TestBase
    • Volo.Abp.Autofac
    • Volo.Abp.TestBase
    • 你的项目对应的ABP模块包(如YourProject.Application、YourProject.HttpApi)
  3. 编写测试模块类:创建继承AbpAspNetCoreTestModule的模块,依赖你的业务模块:
    [DependsOn(
        typeof(AbpAspNetCoreTestModule),
        typeof(YourProjectHttpApiModule),
        typeof(YourProjectApplicationTestModule) // 若存在应用层测试模块需添加
    )]
    public class YourProjectHttpApiTestModule : AbpModule
    {
        public override void ConfigureServices(ServiceConfigurationContext context)
        {
            // 配置测试用数据库,示例为内存数据库
            Configure<AbpDbContextOptions>(options =>
            {
                options.UseInMemoryDatabase("TestDb_Integration");
            });
        }
    }
    
  4. 创建测试基类:
    public abstract class YourProjectHttpApiTestBase : AbpAspNetCoreIntegratedTestBase<YourProjectHttpApiTestModule>
    {
        protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
        {
            options.UseAutofac();
        }
    }
    

三、测试HttpApi控制器的可行方式

方式1:基于TestServer的HTTP请求测试

继承测试基类,通过ITestServerAccessor获取TestServer并创建HttpClient,模拟真实HTTP请求:

public class UserControllerTests : YourProjectHttpApiTestBase
{
    private readonly HttpClient _client;

    public UserControllerTests()
    {
        _client = GetRequiredService<ITestServerAccessor>().Server.CreateClient();
        // 配置认证(若接口需要)
        _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", GetTestAccessToken());
    }

    private async Task<string> GetTestAccessToken()
    {
        var loginResponse = await _client.PostAsJsonAsync("/api/account/login", new 
        { 
            UserName = "test_admin", 
            Password = "Test@123" 
        });
        var loginResult = await loginResponse.Content.ReadFromJsonAsync<LoginResultDto>();
        return loginResult.AccessToken;
    }

    [Fact]
    public async Task Get_Users_Endpoint_Should_Return_Valid_Data()
    {
        var response = await _client.GetAsync("/api/users");
        response.EnsureSuccessStatusCode();
        
        var userList = await response.Content.ReadFromJsonAsync<List<UserDto>>();
        Assert.NotEmpty(userList);
    }
}

方式2:直接实例化控制器(轻量逻辑测试)

若仅需验证控制器内部业务逻辑,无需HTTP管道,可直接注入控制器依赖:

public class UserControllerLogicTests : YourProjectHttpApiTestBase
{
    private readonly UserController _controller;

    public UserControllerLogicTests()
    {
        _controller = GetRequiredService<UserController>();
    }

    [Fact]
    public async Task Get_User_By_Id_Should_Return_Ok_Result()
    {
        var testUserId = Guid.NewGuid();
        var result = await _controller.GetAsync(testUserId);
        
        Assert.IsType<OkObjectResult>(result);
        var returnedUser = ((OkObjectResult)result).Value as UserDto;
        Assert.NotNull(returnedUser);
        Assert.Equal(testUserId, returnedUser.Id);
    }
}

四、测试HttpClient调用Rest Api的方法

如果项目中封装了HttpClient用于调用内部/外部Api,可通过模拟HttpMessageHandler实现测试:

  1. 配置模拟HttpClient:在测试模块的ConfigureServices中替换默认HttpClientFactory:
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        var mockHandler = new MockHttpMessageHandler();
        // 模拟外部Api响应
        mockHandler.When("https://external-service.com/api/users/*")
                   .Respond("application/json", "{\"id\":1,\"name\":\"MockUser\"}");
    
        var mockClient = new HttpClient(mockHandler);
        var mockFactory = new Mock<IHttpClientFactory>();
        mockFactory.Setup(f => f.CreateClient(It.IsAny<string>())).Returns(mockClient);
    
        context.Services.Replace(ServiceDescriptor.Singleton(mockFactory.Object));
    }
    
  2. 编写验证测试:
    public class ExternalApiServiceTests : YourProjectHttpApiTestBase
    {
        private readonly IExternalUserService _externalService;
        private readonly MockHttpMessageHandler _mockHandler;
    
        public ExternalApiServiceTests()
        {
            _externalService = GetRequiredService<IExternalUserService>();
            _mockHandler = (MockHttpMessageHandler)GetRequiredService<IHttpClientFactory>()
                .CreateClient().Handler;
        }
    
        [Fact]
        public async Task Fetch_External_User_Should_Return_Mock_Data()
        {
            var user = await _externalService.GetUserAsync(1);
            
            Assert.Equal("MockUser", user.Name);
            // 验证请求是否按预期发送
            _mockHandler.VerifyNoOutstandingExpectation();
        }
    }
    

五、自动创建集成测试的补充途径

  • 参考ABP官方模块模板中的测试项目结构,直接复制到你的解决方案中,调整依赖和命名空间即可快速复用。
  • 使用ABP代码生成器,针对已有Api控制器生成测试类骨架,减少重复编写基础代码的工作量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:55:34