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

Apollo GraphQL中executeOperation执行Mutation测试失败问题排查

问题排查与修复方案

核心错误原因

你的测试失败主要有三个关键问题:

1. Mutation参数名不匹配

Schema里定义的markWatched接收的参数是ids,但测试代码里的Mutation却传了movieIds,导致Resolver无法获取到正确参数,执行时直接出错:

# 测试里的错误写法
mutation {
    markWatched(movieIds: ${movieIds}) { ... }
}

# 正确写法需匹配Schema的参数名ids
mutation {
    markWatched(ids: [9873, 8754]) { ... }
}

2. 数组参数的字符串拼接语法错误

直接用${movieIds}拼接数组,会把[9873,8754]转成9873,8754,不符合GraphQL的数组语法规范,导致查询解析失败。更稳妥的做法是用变量传递参数,彻底避免字符串拼接的语法坑。

3. 断言方式错误

用expect(result.data.markWatched).toBe(...)比较数组无效,因为toBe是严格引用相等,而数组属于引用类型,必须用toEqual做值的深度比较。

修复后的测试代码

it('should mark movie as watched using the markWatched mutation', async () => {
  const movieIds = [9873, 8754];
  // 用变量传递参数,避免字符串拼接的语法问题
  const mutation = `
    mutation MarkWatched($ids: [ID]!) {
        markWatched(ids: $ids) {
          id,
          watched
        }
    }
  `;

  const result = await testServer.executeOperation({
    query: mutation,
    variables: { ids: movieIds } // 传递变量
  });

  // 先检查是否有查询错误
  expect(result.errors).toBeUndefined();
  // 用toEqual做深度值比较
  expect(result.data.markWatched).toEqual([
    { id: 9873, watched: true },
    { id: 8754, watched: true }
  ]);
});

额外优化建议

每次测试前最好重置moviesData的状态,避免前一次测试修改的数据影响后续测试结果,比如在beforeEach里重置:

beforeEach(() => {
  // 重置moviesData到初始状态,比如重新导入或深拷贝初始数据
  moviesData = [...initialMoviesData];
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:01:35