首页 > 解决方案 > 用于表达功能的模拟功能

问题描述

我有一个 server.js 文件,它有一个 app.get 函数。我想用“jest”来测试这个功能。我很难在下面编写 app.get 函数的模拟函数。

app.get('/api/getUser', (req, res) => {
    res.json({
        'email': req.email,
        'name': req.username
    });
});

标签: javascriptexpresstestingmockingjestjs

解决方案


这是单元测试解决方案,此外,您可以使用supertest编写集成测试

server.js

const express = require('express');
const app = express();

app.get('/api/getUser', (req, res) => {
  res.json({
    email: req.email,
    name: req.username,
  });
});

server.test.js

const express = require('express');

jest.mock('express', () => {
  const express = {
    get: jest.fn(),
  };
  return jest.fn(() => express);
});

describe('60562419', () => {
  it('should send json', () => {
    const mApp = express();
    const mReq = { email: 'example@gmail.com', username: 'jest' };
    const mRes = { json: jest.fn() };
    mApp.get.mockImplementationOnce((route, handler) => {
      handler(mReq, mRes);
    });
    require('./server');
    expect(express).toBeCalled();
    expect(mApp.get).toBeCalledWith('/api/getUser', expect.any(Function));
    expect(mRes.json).toBeCalledWith({ email: 'example@gmail.com', name: 'jest' });
  });
});

覆盖率 100% 的单元测试结果:

 PASS  stackoverflow/60562419/server.test.js (9.939s)
  60562419
    ✓ should send json (581ms)

-----------|---------|----------|---------|---------|-------------------
File       | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-----------|---------|----------|---------|---------|-------------------
All files  |     100 |      100 |     100 |     100 |                   
 server.js |     100 |      100 |     100 |     100 |                   
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        11.476s

推荐阅读