使用 jest 和 superagent 进行测试时如何模拟函数
How to mock functions when testing with jest and superagent
我 运行 遇到无法模拟文件和函数的问题,该问题用在 API 调用的处理程序中。此调用是使用 superagent 模拟的。
这里是测试代码
// users.itest.js
const request = require('superagent');
const get = async url => request
.get(`${process.env.API_URL}${url}`);
describe('endpoint', () => {
it('GET', async () => {
jest.mock('../token-store', () => ({
getToken: jest.fn().mockReturnValue('token'),
}));
const { status, body } = await get('/api/users');
expect(status).toEqual(200);
expect(body).toHaveValidSchema(userSchema);
});
这是由“/api/users”端点调用的处理程序
const someHandler = async (req, res) => {
const token = await tokenStore.getToken();
res.send(token);
};
我试过如图所示模拟它,但是,我找不到解决方案。
谢谢
您应该在模块范围内使用 jest.mock()
,而不是函数范围。
这是集成测试解决方案:
app.js
:
const express = require('express');
const tokenStore = require('./token-store');
const app = express();
const someHandler = async (req, res) => {
const token = await tokenStore.getToken();
res.send(token);
};
app.get('/api/users', someHandler);
module.exports = app;
token-store.js
:
async function getToken() {
return 'real token';
}
module.exports = {
getToken,
};
users.test.js
:
const request = require('superagent');
const app = require('./app');
const port = 3000;
process.env.API_URL = `http://localhost:${port}`;
const get = async (url) => request.get(`${process.env.API_URL}${url}`);
jest.mock('./token-store', () => ({
getToken: jest.fn().mockReturnValue('token'),
}));
describe('endpoint', () => {
let server;
beforeAll((done) => {
server = app.listen(port, () => {
console.info(`HTTP server is listening on http://localhost:${server.address().port}`);
done();
});
});
afterAll((done) => {
server.close(done);
});
it('GET', async () => {
const { status, text } = await get('/api/users');
expect(status).toEqual(200);
expect(text).toBe('token');
});
});
集成测试结果与覆盖率报告:
PASS src/Whosebug/59426030/users.test.js (10.767s)
endpoint
✓ GET (74ms)
console.info src/Whosebug/59426030/users.test.js:16
HTTP server is listening on http://localhost:3000
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
app.js | 100 | 100 | 100 | 100 | |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 12.254s
源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/Whosebug/59426030
我 运行 遇到无法模拟文件和函数的问题,该问题用在 API 调用的处理程序中。此调用是使用 superagent 模拟的。
这里是测试代码
// users.itest.js
const request = require('superagent');
const get = async url => request
.get(`${process.env.API_URL}${url}`);
describe('endpoint', () => {
it('GET', async () => {
jest.mock('../token-store', () => ({
getToken: jest.fn().mockReturnValue('token'),
}));
const { status, body } = await get('/api/users');
expect(status).toEqual(200);
expect(body).toHaveValidSchema(userSchema);
});
这是由“/api/users”端点调用的处理程序
const someHandler = async (req, res) => {
const token = await tokenStore.getToken();
res.send(token);
};
我试过如图所示模拟它,但是,我找不到解决方案。 谢谢
您应该在模块范围内使用 jest.mock()
,而不是函数范围。
这是集成测试解决方案:
app.js
:
const express = require('express');
const tokenStore = require('./token-store');
const app = express();
const someHandler = async (req, res) => {
const token = await tokenStore.getToken();
res.send(token);
};
app.get('/api/users', someHandler);
module.exports = app;
token-store.js
:
async function getToken() {
return 'real token';
}
module.exports = {
getToken,
};
users.test.js
:
const request = require('superagent');
const app = require('./app');
const port = 3000;
process.env.API_URL = `http://localhost:${port}`;
const get = async (url) => request.get(`${process.env.API_URL}${url}`);
jest.mock('./token-store', () => ({
getToken: jest.fn().mockReturnValue('token'),
}));
describe('endpoint', () => {
let server;
beforeAll((done) => {
server = app.listen(port, () => {
console.info(`HTTP server is listening on http://localhost:${server.address().port}`);
done();
});
});
afterAll((done) => {
server.close(done);
});
it('GET', async () => {
const { status, text } = await get('/api/users');
expect(status).toEqual(200);
expect(text).toBe('token');
});
});
集成测试结果与覆盖率报告:
PASS src/Whosebug/59426030/users.test.js (10.767s)
endpoint
✓ GET (74ms)
console.info src/Whosebug/59426030/users.test.js:16
HTTP server is listening on http://localhost:3000
----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
app.js | 100 | 100 | 100 | 100 | |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 12.254s
源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/Whosebug/59426030