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

Gitbeaker API客户端初始化、传递及测试报错问题求助

问题解决:Gitbeaker API 初始化与测试报错处理

一、解决 requesterFn must be passed 测试报错

问题根源

@gitbeaker/core 是抽象核心层,本身不内置 HTTP 请求实现,必须搭配具体的请求适配器(如 @gitbeaker/node)才能正常工作。你的生产代码可能间接依赖了适配器,但测试环境未正确初始化,且 mock 方式有误。

修复步骤

  1. 生产代码替换依赖包
    改用 @gitbeaker/node(已集成 core 和 Node.js 环境请求适配器),简化初始化逻辑:

    // createGitLabApi.ts
    import { Gitlab } from '@gitbeaker/node'
    import RepositoryModel from '../models/repository/repositoryModel'
    
    const createGitLabApi = async (repoId: number): Promise<Gitlab<false>> => {
        const repository = await RepositoryModel.findByPk(repoId)
        if (!repository)
            throw new Error(`The repository ID [${repoId}] doesn't exist in database!`)
    
        return new Gitlab({
            token: repository.token ?? '',
            host: repository.host
        })
    }
    
    export default createGitLabApi
    
  2. 修正测试代码的 Mock 方式
    不要直接实例化真实客户端后再 mock,而是通过 jest.mock 整个包来模拟客户端:

    // 先 mock 整个 @gitbeaker/node 包
    jest.mock('@gitbeaker/node', () => {
      return {
        Gitlab: jest.fn().mockImplementation(() => ({
          // 按需 mock 业务中用到的 API 方法,比如项目列表接口
          projects: {
            list: jest.fn().mockResolvedValue([
              { id: 1, name: 'test-project', path: '/test' }
            ])
          }
        }))
      };
    });
    
    import { Gitlab } from '@gitbeaker/node';
    
    // 创建 mock 实例并指定类型
    const mockedGitLabApi = new Gitlab({ host: '', token: '' }) as jest.Mocked<InstanceType<typeof Gitlab>>;
    
    // 调用业务函数
    const projects: GitLabProjectType[] = await getGitLabProjects(mockedGitLabApi, path);
    

二、解决 @gitbeaker/rest 的 TypeScript 类型问题

问题根源

@gitbeaker/rest 的 Gitlab 类是默认导出,而非命名导出,直接用 import { Gitlab } 会被 TypeScript 识别为值而非类型。

正确初始化与类型使用

  1. 正确导入与初始化

    import Gitlab from '@gitbeaker/rest'; // 默认导入类
    
    // 初始化客户端
    const gitLabApi = new Gitlab({
      token: 'your-gitlab-token',
      host: 'https://your-gitlab-instance.com'
    });
    
  2. 类型定义与使用
    使用 InstanceType<typeof Gitlab> 提取实例类型:

    // 定义客户端类型
    type GitlabRestClient = InstanceType<typeof Gitlab>;
    
    // 函数参数中使用类型
    async function getGitLabProjects(api: GitlabRestClient, path: string) {
      const projects = await api.projects.list({ search: path });
      return projects;
    }
    

总结

  • 优先使用 @gitbeaker/node(Node.js 环境)或 @gitbeaker/rest(通用 REST 场景),避免直接依赖 @gitbeaker/core(需手动配置请求适配器,易出错)。
  • 测试时通过 jest.mock 整个包来模拟客户端,不要实例化真实对象后再 mock。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:42:23