Как устранить ошибку (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"}]
Что не так с моим кодом? Уже кучу русскоязычных и англоязычных ресурсов перерыл. Доку посмотрел, но нифига не понял, что я сделал не так. Всё без толку.