Jest: How to mock db response from controller?

Viewed 371

I am learning unit testing. I wanted to mock the database response from the controller. How can I do that? here is my code:

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);
  });
});
2 Answers

I got a solution using the mongodb-memory-server package.

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);
  });
});
Related