繁体   English   中英

使用 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/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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM