【问题标题】:Mocking express with jest?用玩笑来嘲讽快递?
【发布时间】:2025-12-13 02:45:01
【问题描述】:

我对 JS 很陌生,但我正在努力学习。事实上,我试图模拟快递。这是我的基类(为了测试目的而删减了):

import compression from 'compression';
import express from 'express';

export default class Index{
    constructor(){}

    spawnServer(){
        console.log(express());
        let app = express();    

        app.use(STATIC_PATH, express.static('dist'));
        app.use(STATIC_PATH, express.static('public'));
        etc...
    }
}

这是我试图实现的测试,在一个单独的测试文件中......:

test('should invoke express once', () =>{    
     index.spawnServer();    
     expect(mockExpressFuncs().use.mock.calls.length).toBe(3);
})

我的问题是 - 我如何让测试覆盖被测类的要求 - 这甚至可能吗?我想让我的索引使用 express 的模拟版本,包括 express() 和 express.require。

我确实阅读了文档,并尝试了类似的内容:

const mockFunction = function() {
        return {
            use: useFn,
            listen: jest.fn()
        };
    };

beforeEach(() => {                    
    jest.mock('express', () => {    
        return mockFunction;
    })
    express = require('express');
});

但这不起作用 - 我做错了什么? :(

谢谢。

【问题讨论】:

    标签: node.js unit-testing express jestjs


    【解决方案1】:

    创建mock app对象,并由express模块​​返回。

    然后您可以检查使用expect(app.use.mock.calls.length).toBe(3) 或更好的expect(app.use).toHaveBeenCalledTimes(1) 调用app.use 的次数

    const app = {
      use: jest.fn(),
      listen: jest.fn()
    }
    jest.doMock('express', () => {
      return () => {
        return app
      }
    })
    
    test('should invoke express once', () => {
      expect(app.use).toHaveBeenCalledTimes(1)
    })
    

    【讨论】: