Jest.mock无法模拟等待用户输入的工具函数问题排查
问题原因
你的测试无限挂起是因为**shared_functions.js里的create_character直接调用了模块内部的user_prompt函数,而非导出的引用**。Jest的mock仅替换了模块对外导出的user_prompt,但实际执行的是模块内未被mock的原始user_prompt,所以依然会等待用户输入。
解决方案
方案1:修改业务代码,使用导出的函数引用
调整shared_functions.js,让create_character调用模块自身导出的user_prompt,确保Jest的mock能生效:
import PromptSync from "prompt-sync" const prompt = PromptSync() // 导入自身模块的引用 import * as self from './shared_functions.js' function create_character( gamestate ) { print( `\n` ) // 改用导出的user_prompt调用 var NAME = self.user_prompt( 'What is your name? ' ); let character = new Player_Class( NAME, 4, 4, 4 ) character.update_condition( "fresh", true ) print( `Welcome ${character.playername}!` ) gamestate.player = character } function user_prompt ( question ) { return prompt( question ) ; } export { create_character, user_prompt }
方案2:直接mock依赖的prompt-sync模块
如果不想改动业务代码,可以从根源mock用户输入依赖,替换prompt-sync的实现:
import * as game from "./game.js" // mock整个prompt-sync模块 jest.mock('prompt-sync', () => { return () => jest.fn(() => 'Name'); }); test('should do a partial mock', () => { // 建议让main_loop返回gamestate,或者将其暴露为可访问的变量 const gamestate = game.main_loop(); expect( gamestate.player.inventory ).toContain( ritual_dagger ); });
额外注意事项
- 测试中
gamestate未定义,需要让main_loop返回该对象,或者将其设为模块可访问的变量 ritual_dagger需要在测试文件中引入或定义,否则会抛出未定义错误
内容的提问来源于stack exchange,提问作者Bogsworth
相关产品推荐
相关产品推荐

