NestJs单元测试错误:TypeError: this.X不是一个函数



我为一个控制器方法编写的单元测试有一个小问题。

短版:

return this.userPreferencesService.createPreferences(eUserId, userPreferences);

长版:

我得到这个错误:

UserPreferencesController › createUserPreferences › should create a new userPreferences
TypeError: this.userPreferencesService.createPreferences is not a function
31 |             userPreferences: TestUserPreferencesDto,
32 |     ): Promise<UserPreferences> {
> 33 |         return this.userPreferencesService.createPreferences(eUserId, userPreferences);
|                                            ^
34 |     }
35 |
36 |     /**
at UserPreferencesController.createPreferences (user-preferences/user-preferences.controller.ts:33:44)
at Object.<anonymous> (user-preferences/user-preferences.controller.spec.ts:67:45)

toBeDefined通过,但createUserPreferences因上述错误而失败。代码工作得很好,只有测试失败。我只是找不到它不是函数的原因?

服务文件内容(仅限相关数据):

@Injectable()
export class UserPreferencesService {
constructor(@InjectModel('UserPreferences') private userPreferencesModel: Model<UserPreferences>) {
}

/**
* ADD a single user preferences by id => POST api/v1/user-preferences/
* @param userPreferences
*/
async createPreferences(eUserId: string, userPreferences: TestUserPreferencesDto): Promise<UserPreferences> {
Object.assign(userPreferences, {eUserId: eUserId});
return this.userPreferencesModel.create(userPreferences);
}

这是控制器(仅限相关数据)

@Controller('v1/user-preferences')
export class UserPreferencesController {
constructor(private userPreferencesService: UserPreferencesService) {}
/**
* Add user preferences to the database
* @param userPreferences
*/
@Post()
async createPreferences(
@Headers('x-e-user-id') eUserId: string,
@Body()
userPreferences: TestUserPreferencesDto,
): Promise<UserPreferences> {
return this.userPreferencesService.createPreferences(eUserId, userPreferences);
}

这是整个测试文件:

import {Test, TestingModule} from '@nestjs/testing';
import { getModelToken } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import {UserPreferencesController} from './user-preferences.controller';
import {UserPreferencesService} from './user-preferences.service';
import { exitToOptions } from './schemas/user-preferences.schema';
const ReturnedUserPreferencesMock = {
_id: '62a161a9654a511b28e6f3db',
eUserId: '123456',
uiTheme: 'dark',
panelWidth: 300,
editingHandles: true,
enableLightboxInEditor: true,
hiddenElements: true,
defaultDeviceView: 'mobile',
exitTo: exitToOptions.DASHBOARD,
};
const eUserIdeMock = '123456';
const userPreferencesMock = {
uiTheme: 'dark',
panelWidth: 327,
editingHandles: true,
enableLightboxInEditor: true,
hiddenElements: true,
defaultDeviceView: 'mobile',
exitTo: exitToOptions.DASHBOARD,
}

const mockUserPreferencesService = {
create: jest.fn().mockResolvedValueOnce(ReturnedUserPreferencesMock),
}

describe('UserPreferencesController', () => {
let controller: UserPreferencesController;
let service: UserPreferencesService;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
controllers: [UserPreferencesController],
providers: [{
provide: UserPreferencesService,
useValue: mockUserPreferencesService
}]
}).compile();
controller = module.get<UserPreferencesController>(UserPreferencesController);
service = module.get<UserPreferencesService>(UserPreferencesService);
});
it('Controler should be defined', () => {
expect(controller).toBeDefined();
});
describe('createUserPreferences', () => {
it('should create a new userPreferences', async () => {
const result = await controller.createPreferences(eUserIdeMock, userPreferencesMock);
expect(service.createPreferences).toHaveBeenCalledWith(eUserIdeMock, userPreferencesMock);
expect(result).toEqual(ReturnedUserPreferencesMock);
});
});
});

您提供的mockUserPreferencesService没有createPreferences方法,只有create。您需要为将要调用mock的原始服务的每个方法提供一个实现。

const mockUserPreferencesService = {
create: jest.fn().mockResolvedValueOnce(ReturnedUserPreferencesMock),
createPreferences: jest.fn().mockResolvedValueOnce(WhateverObjectShouldGoHere),
}