0

I am trying to write some unit tests for some of the functions that were written in one of our APIs, but I am relatively new to writting tests, so I wonder how can I write a test for the function below using jest:

  let keys = Object.keys(item)
  let obj: Array<any> = [];
  for (const key of keys) {
    if (key == "beginDate" || key == "endDate" || key == "planningDate" || key == "executionDate" || key == "releaseDate") {
      item[key] = new Date(item[key])
    }
    obj.push({ [key]: item[key] })
    try {
      await this.itemRepository.createQueryBuilder().update(Item).set({
        [key]: item[key]
      }).where("id = :id", { id: id }).execute();
    } catch (error) {
       throw new HttpException({"message": "Error when trying to update Item"},  error);
    }
   }

This function is part of a bigger function, so item is as object that I am receiving before.

I am using NestJS framework and I already mocked a repository, but I don't know how can I mock a createQueryBuilder function in my mocked repository.

Thanks a lot!

Victor Guidi
  • 55
  • 1
  • 6

1 Answers1

0

So, to mock createQueryBuilder you need to mock each of its methods individually. In your case it going to look like this:

 describe("GET", () => {
        it("should return a item", async () => {
          const execute = jest.fn();
          const where = jest.fn(() => ({ execute }));
          const set = jest.fn(() => ({ where }));
          const update = jest.fn(() => ({ set }));
          spyRepository.createQueryBuilder = jest.fn(() => ({ update }));
        
          await service.findOneById(itemId);
          expect(spyRepository.createQueryBuilder).toHaveBeenCalledWith(tableName);
    
    expect(where).toHaveBeenCalledWith(`${tableName}.itemId='${Number(id)}'`);
});

More detailed answer

chavy
  • 841
  • 10
  • 20