【问题标题】:How to mock a function while testing Node.js endpoint using chai-http如何在使用 chai-http 测试 Node.js 端点时模拟函数
【发布时间】:2021-09-07 04:18:19
【问题描述】:

端点代码:

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

集成测试: 下面的测试用于测试端点 (/api/v1/user)。 createUser(req); 函数将用户创建到数据库中。我想在测试时跳过将用户创建到数据库中。 你能帮我在下面的测试中模拟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();
            });
    });
});

【问题讨论】:

    标签: javascript node.js mocha.js chai chai-http


    【解决方案1】:

    如果您可以将跑步者从 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"
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      相关资源
      最近更新 更多