首页 > 解决方案 > 使用 jest 和 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);
};

我尝试像显示的那样模拟它,但是,我找不到解决方案。谢谢。

标签: node.jsexpressjestjssuperagent

解决方案


您应该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/stackoverflow/59426030/users.test.js (10.767s)
  endpoint
    ✓ GET (74ms)

  console.info src/stackoverflow/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/stackoverflow/59426030


推荐阅读