使用queueOperationResolver测试多GraphQL查询组件时仅生效一次求助
问题原因与解决方案
你遇到的问题是对queueOperationResolver的作用理解有误,它并非持续监听新发起的查询,而是仅处理调用该方法时已存在于操作队列中的查询,处理完成后就会失效,后续新增的查询不会触发这个解析器。这属于用法问题,并非预期行为。
正确用法:使用setResolver替代queueOperationResolver
如果需要自动处理所有后续发起的查询(包括组件渲染时的、用户交互触发的),应该使用environment.mock.setResolver,它会设置一个全局的解析函数,每次有新查询发起时都会调用它。
修改后的代码示例:
// 替换queueOperationResolver为setResolver environment.mock.setResolver((operation) => { return solveRelayQuery(operation, testCurrencyCode, queryHandler); }); const user = userEvent.setup(); await act(async () => { render( <RelayEnvironmentProvider environment={environment}> <MemoryRouter> <MyTestComponent /> </MemoryRouter> </RelayEnvironmentProvider> ); });
两个API的核心区别
queueOperationResolver:一次性消费当前队列中的所有操作,仅执行一次,后续新增的操作不会触发它。适合处理初始渲染前就已入队的查询。setResolver:全局生效的持久解析器,所有新发起的操作都会调用该函数,直到调用environment.mock.clearResolver()清除它。适合需要自动处理多轮查询的测试场景。
如果后续需要清除这个全局解析器,在测试结束后可以调用:
environment.mock.clearResolver();
内容的提问来源于stack exchange,提问作者Arthur Sady Cordeiro Rossetti
相关产品推荐
相关产品推荐

