【问题标题】:Jest: How to mock db response from controller?笑话:如何模拟来自控制器的数据库响应?
【发布时间】:2021-12-23 20:31:05
【问题描述】:

我正在学习单元测试。我想模拟来自控制器的数据库响应。 我怎样才能做到这一点? 这是我的代码:

imageController.ts

 const getImages = async (req: Request, res: Response) => {
  const images = await Image.find({}).sort({ date: -1 });
  return res.status(200).json(images);
};

image.test.ts

describe("It shuld be get methoad", () => {
  test("get all image url", async () => {
    const res = await request(app).get("/api/v1/all");
    expect(res.statusCode).toBe(200);
    // console.log(res.body);
    let images = res.body
    // expect(images.length).toBeGreaterThan(0);
  });
});

【问题讨论】:

    标签: node.js express jestjs


    【解决方案1】:

    您似乎正在使用 Mongoose,所以我建议使用一个不错且非常流行的库来模拟 Mongoose:https://www.npmjs.com/package/mockingoose

    【讨论】:

    • 安装@types/mockingoose 后,打字稿不支持。它显示此消息-----找不到模块“mockingoose”的声明文件。 '/home/imran/Practice/jest-ts/node_modules/mockingoose/lib/index.js' 隐含了一个 'any' 类型。尝试npm i --save-dev @types/mockingoose(如果存在)或添加包含declare module 'mockingoose';的新声明(.d.ts)文件
    • @AlImranHossain 是的,只需运行npm i --save-dev @types/mockingoose 安装声明文件,以便 TS 了解模块。
    • 已应用但不起作用。相同的消息显示
    【解决方案2】:

    我得到了一个使用mongodb-memory-server 包的解决方案。

    import request from "supertest";
    import app from "../src/app";
    import { MongoMemoryServer } from "mongodb-memory-server";
    import mongoose from "mongoose";
    import { fakeImage, fakeAddImage } from "../src/utils/data";
    import Image from "../src/models/image";
    
    describe("Image CRUD operation test", () => {
      //For mocking db
      beforeAll(async () => {
        const mongoServer = await MongoMemoryServer.create();
    
        await mongoose.connect(mongoServer.getUri());
      });
    
      afterAll(async () => {
        await mongoose.disconnect();
        await mongoose.connection.close();
      });
    
    
      it("should return a 200 & get image by id", async () => {
        const image = await Image.create(fakeImage);
        console.log("image", image);
    
        const { body, statusCode } = await request(app).get(
          `/api/v1/image/${image._id}`
        );
        // console.log("body", body);
        expect(statusCode).toBe(200);
        expect(body.data.title).toBe(image.title);
      });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 2019-07-23
      相关资源
      最近更新 更多