我想测试是否调用了app.js中的中间件。尽管我模拟了work.js模块,但它仍然运行原始代码。
app.js
const work = require('./work')
const express = require('require')
const app = express()
.use(work)
.use(...)
.get(...)
module.exports = app
work.js
function work(req, res, next){...}
module.exports = work
app-test.js
const supertest = require('supertest')
const app = require('../app')
test('test middleware in app.js', async(done) => {
jest.mock('../work', () => jest.fn((req, res, next) => next()))
const agent = () => supertest(app)
const work = require('../work')
await agent()
.get('/')
.set(...)
expect(work).toHaveBeenCalledTimes(1) // Error
done()
})
我希望work.js会被调用一次。有什么问题吗?我应该更改测试吗?
答案 0 :(得分:2)
经过一些修补,我设法用不需要服务器的版本复制了 slideshowp2 的示例(有效 :))。
var express = require("express");
var supertest = require("supertest");
var httpContext = require("express-http-context");
var app = express();
// before uses
app.use(httpContext.middleware);
// before gets etc.
app.use(work());
app.get("/", (req, res) => {
console.log("get");
res.sendStatus(200);
});
describe("work", () => {
it("should call work", async () => {
var agent = supertest.agent(app);
const res = await agent.get("/");
expect(res.status).toBe(200);
// expect...;
});
});
// work.js
export function work() {
return (req, res, next) => {
console.log("work");
next();
};
}
答案 1 :(得分:0)
以下示例对我有用:
app.js
:
const work = require('./work');
const express = require('express');
const app = express();
app.use(work).get('/', (req, res) => {
res.sendStatus(200);
});
module.exports = app;
work.js
:
function work(req, res, next) {
next();
}
module.exports = work;
app.spec.js
:
jest.mock('./work', () => jest.fn((req, res, next) => next()));
const supertest = require('supertest');
const app = require('./app');
const work = require('./work');
let agent;
let server;
beforeEach(done => {
server = app.listen(4000, err => {
if (err) return done(err);
agent = supertest(server);
done();
});
});
afterEach(done => {
server && server.close(done);
});
describe('app', () => {
test('test middleware in app.js', async () => {
const response = await agent.get('/');
expect(response.status).toBe(200);
expect(work).toHaveBeenCalledTimes(1);
});
});
覆盖率100%的单元测试结果:
PASS src/stackoverflow/56014527/app.spec.js
app
✓ test middleware in app.js (90ms)
----------|----------|----------|----------|----------|-------------------|
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: 5.248s
以下是完整的演示:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/56014527