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

