为什么用Jest测试时express.urlencoded没有功能?

时间:2019-07-19 13:27:27

标签: node.js express jestjs

我正在使用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不是函数。

1 个答案:

答案 0 :(得分:0)

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

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);
});

编辑:

我对Express并不熟悉,但是您可以尝试以下示例。 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);
});