Как устранить ошибку (Jest): Matcher error: received value must be a mock or spy function

В NestJS приложении тестирую контроллер. Для этого написал вот такой тест:

import { Test } from '@nestjs/testing';
import { GymController } from './gym.controller';
import { GymService } from './gym.service';
import { UserRole } from '@fit-friends/shared-types';
import { Types } from 'mongoose';
import { fillDTO } from '@fit-friends/core';
import { GymRdo } from './rdo/gym.rdo';

const RESULT = {
  id: 1,
  title: 'Grand fitness',
  location: 'Пионерская',
  isVerified: true,
  gymFeatures: ['Бассейн', 'Массаж'],
  photos: ['photo1.png', 'photo2.png'],
  description: 'Спортивный комплекс премиум-класса с 3 видами сауны, бассейном длинной 54 м., услугами массажиста и большой парковкой.',
  price: 750,
  registerDate: new Date(),
};

const USER = {
  id: new Types.ObjectId('64492fb4d9b7e51ccd8f1e43'),
  email: '',
  name: '',
  avatar: '',
  role: UserRole.Client,
  favoriteGyms: [1],
};

describe('GymController', () => {
  let gymController: GymController;
  const mockGymService = {
    getGyms: jest.fn(() => [RESULT]),
    getFavoriteGyms: jest.fn(() => [RESULT]),
    getGym: jest.fn(() => RESULT),
  };

  beforeAll(async () => {
    const module = await Test.createTestingModule({
      controllers: [GymController],
      providers: [GymService],
    })
      .overrideProvider(GymService)
      .useValue(mockGymService)
      .compile();

    gymController = module.get<GymController>(GymController);
  });

  describe('showGyms', () => {
    it('should return an array of gyms', async () => {
      expect(mockGymService.getGyms()).toHaveBeenCalled();
      expect(await gymController.index({limit: 1}, UserRole.Client)).toEqual([fillDTO(GymRdo, RESULT)]);
    });
  });

  describe('showFavoriteGyms', () => {
    it('should return array of favorite gyms', async () => {
      expect(mockGymService.getFavoriteGyms()).toHaveBeenCalled();
      expect(await gymController.showFavoriteGyms(USER)).toEqual([RESULT]);
    });
  });

  describe('showOneGym', () => {
    it('should return the gym by its ID', async () => {
      expect(mockGymService.getGym()).toHaveBeenCalled();
      expect(await gymController.show(1, UserRole.Client)).toEqual(RESULT);
    });
  });
});

И все 3 теста возвращают одинаковую ошибку:

● GymController › showGyms › should return an array of gyms

    expect(received).toHaveBeenCalled()

    Matcher error: received value must be a mock or spy function

    Received has type:  array
    Received has value: [{"description": "Спортивный комплекс премиум-класса с 3 видами сауны, бассейном длинной 54 м., услугами массажиста и большой парковкой.", "gymFeatures": ["Бассейн", "Массаж"], "id": 1, "isVerified": true, "location": "Пионерская", "photos": ["photo1.png", "photo2.png"], "price": 750, "registerDate": 2023-04-27T13:09:40.300Z, "title": "Grand fitness"}]

Что не так с моим кодом? Уже кучу русскоязычных и англоязычных ресурсов перерыл. Доку посмотрел, но нифига не понял, что я сделал не так. Всё без толку.


Ответы (0 шт):