使用Jest和Superagent测试时如何模拟函数

时间:2019-12-20 13:28:24

标签: node.js express jestjs superagent

我遇到了一个问题,即无法模拟文件和函数,该问题在API调用的处理程序中使用。此呼叫是使用超级代理模拟的。

这是测试代码

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

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

1 个答案:

答案 0 :(得分:0)

您应该在模块作用域而不是函数作用域中使用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