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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:32:43