如何在使用chai-http测试Node.js端点时模拟函数



终端代码:

app.post('/api/v1/user', async function (req, res) {
const user = await createUser(req);
res.send(user);
});

集成测试:下面的测试是用来测试端点(/api/v1/user)的。createUser(req);函数将用户创建到DB。我想跳过创建用户到数据库,而测试。你能帮我在下面的测试中模拟createUser(req);吗?

import chai from 'chai';
import chaiHttp from 'chai-http';
chai.use(chaiHttp);
import { app } from '../../server';
describe('Create user tests', function () {
it('user should be created', function (done) {
chai.request(app)
.post('/api/v1/user')
.set({
'content-type': 'application/json',
})
.send({
name: 'xxxxx',
email: 'xxx@mail.com',
})
.end((err, res) => {
res.should.have.status(200);
done();
});
});
});

如果您可以将您的运行器从mocha替换为jest,以下解决方案可以为您工作:

let fetch = require("node-fetch");
let chai = require("chai");
let chaiHttp = require("chai-http");
let expect = chai.expect;
chai.use(chaiHttp);
let { app } = require("./main");
jest.mock("node-fetch", () => {
let instance = {
json: jest.fn(),
};
return () => instance;
});
describe("Create user tests", function () {
it("user should be created", function (done) {
fetch().json.mockReturnValueOnce("user-created");
chai
.request(app)
.post("/api/v1/user")
.set({
"content-type": "application/json",
})
.send({
name: "xxxxx",
email: "xxx@mail.com",
})
.end((err, res) => {
expect(err).to.be.null;
expect(res).to.have.status(200);
expect(res.body.ok).to.equal(true);
expect(res.body.payload).to.equal("user-created");
done();
});
});
it("user failed to be created", function (done) {
fetch().json.mockImplementationOnce(() => {
throw new Error("test-error");
});
chai
.request(app)
.post("/api/v1/user")
.set({
"content-type": "application/json",
})
.send({
name: "xxxxx",
email: "xxx@mail.com",
})
.end((err, res) => {
expect(err).to.be.null;
expect(res).to.have.status(500);
expect(res.body.ok).to.equal(false);
expect(res.body.payload).to.equal(undefined);
expect(res.body.error).to.equal("test-error");
done();
});
});
});
在上面的示例中,我使用了以下服务器:
let express = require("express");
let fetch = require('node-fetch');

let app = express();
app.use(express.json());
async function createUser(params) {
try {
let res = await fetch("https://random-data-api.com/api/users/random_user");
let json = await res.json();
return { ok: true, payload: json };
} catch (error) {
return { ok: false, error: error.message };
}
}
app.post("/api/v1/user", async function (req, res) {
let user = await createUser(req);
if (user.ok) {
res.status(200).send(user);
} else {
res.status(500).send(user);
}
});
module.exports = { app };

和以下package.json

{
"dependencies": {
"chai": "4.3.4",
"chai-http": "4.3.0",
"express": "4.17.1",
"jest": "27.1.0",
"node-fetch": "2.6.2"
}
}

最新更新