Jest测试getRunningContainers函数返回undefined问题求助
问题排查与修复方案
我帮你梳理下getRunningContainers返回undefined的核心原因,以及对应的修复步骤:
1. Mock对象缺少关键方法导致报错
在你的测试代码里,MockDockerClient.getContainer返回的dummy_container并没有实现inspect方法,但getRunningContainers逻辑中会调用container.inspect()来获取容器详情。当执行到这一步时,会抛出TypeError: container.inspect is not a function的错误,触发catch块,最终返回undefined。
修复Mock对象:
给dummy_container添加inspect方法,让它返回模拟的容器检查信息:
const dummy_container = { // 保留你原有的dummy_container属性 inspect: () => new Promise((resolve) => { resolve(dummy_container_inspect); // 这里需要定义一个符合ContainerInspectInfo结构的模拟数据 }) };
同时,确保MockDockerClient.listContainers返回的dummy_info是一个包含Id字段的数组,比如:
const dummy_info = [{ Id: 'test-container-id' }]; // 符合ContainerInfo的结构要求
2. 测试断言类型不匹配
你的测试用例中,expect(containers).toEqual(dummy_container)是错误的:getRunningContainers返回的是容器数组,而dummy_container是单个容器对象,两者类型完全不匹配。
调整断言逻辑:
如果你的模拟数据返回一个运行中的容器,断言应该改为:
expect(containers).toEqual([dummy_container_inspect]); // 对应inspect返回的模拟数据数组
3. 额外检查点
- 确认
dummy_container_inspect的结构完全符合ContainerInspectInfo类型定义,避免因类型不兼容导致的隐性错误; - 可以在catch块中添加更详细的错误日志(比如
console.error代替console.log),方便快速定位报错原因:catch (err) { console.error(`running containers error: ${err}`); // 用error级别日志更醒目 return; }
修复后的测试代码示例
调整后的Mock和测试用例大概是这样:
describe('Container Client', () => { // 定义模拟数据 const dummy_info = [{ Id: 'test-id' }]; const dummy_container_inspect = { /* 填充符合ContainerInspectInfo的结构 */ }; const dummy_container = { inspect: () => Promise.resolve(dummy_container_inspect) }; const MockDockerClient = { listContainers: (opts: any) => Promise.resolve(dummy_info), createContainer: (opts: any) => Promise.resolve(dummy_container), getContainer: (id: any) => Promise.resolve(dummy_container) }; const containerClient = new Container(MockDockerClient); test('get running containers returns correct list', async () => { const containers = await containerClient.getRunningContainers(); expect(containers).toEqual([dummy_container_inspect]); }); });
内容的提问来源于stack exchange,提问作者Sarthak Kundra
相关产品推荐
相关产品推荐

