首页 > 解决方案 > 为什么在使用 Jest 进行测试时 express.urlencoded 不是函数?

问题描述

我正在使用 Jest 测试我的 app.js,它说它express.urlencoded不是一个函数。

我正在使用 express 4.16.4,而我正在为 app.js 编写测试,看起来有点像这样

const express = require('express');
const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(require('./routes'));
module.exports = app;

我的测试用例是:

jest.mock('express');
it('has a parser', () => {
        const app = require('../src/app');
        const express = require('express');
        expect(app.use).toHaveBeenCalledWith(express.urlencoded());
    });

这给了我一个错误说:express.urlencoded is not a function.

我希望这个测试能够通过,因为该应用程序运行良好,但只有在测试中它说 express.urlencoded 不是一个函数。

标签: node.jsexpressjestjs

解决方案


您必须在那里手动提供要测试的工厂和模拟模块方法。这看起来像这样:

const urlencodedMock = jest.fn();
jest.mock('express', () => {
    urlencoded: urlencodedMock,
});
it('has a parser', () => {
    const app = require('../src/app');
    const express = require('express');
    expect(app.use).toHaveBeenCalledWith(urlencodedMock);
});

编辑:

我不熟悉快递,但你可以试试下面的例子。jest.mock()将以它通过的方式模拟表达,express()然后当该部分通过时在测试内部,它将再次模拟它,以提供json()urlencoded()表达的功能。

jest.mock('express', () => {
    return {
        use: () => {
            return;
        }
    }
});
it('has a parser', () => {
    const jsonMock = jest.fn();
    const urlencodedMock = jest.fn();
    const app = require('../src/app');
    jest.doMock('express', () => {
        json: jsonMock,
        urlencoded: urlencodedMock,
    });
    expect(app.use).toHaveBeenCalledWith(urlencodedMock);
});

推荐阅读