Невозможно spyOn на примитивном значении; undefined указано в nestJS - PullRequest
1 голос
/ 10 июля 2020

Я знаю, что этот вопрос задавался раньше, но у меня эта ошибка возникает в js, когда я запускаю функцию тестирования службы

вот мой код службы

user.service.ts

import { Injectable,HttpException, HttpCode, HttpStatus  } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';
import { UserRegisterAC } from '../application/userRegisterAC';

@Injectable()
export class UserService {

constructor(
@InjectRepository(User)
private readonly userRepository: Repository<User>) {}

async allUsersList(): Promise<User[]> {
 var users = this.userRepository.find();

 if(users==null){
  throw new HttpException("Users not found",HttpStatus.NOT_FOUND)
 }else{
  return users as unknown as User[];
 }
}

async create(userDTO: UserRegisterAC): Promise<User> {
const user = new User();

user.name = userDTO.name;
user.phoneNo = userDTO.phoneNo;
return this.userRepository.save(user);
}
}

user.spe c .ts

import { Test, TestingModule } from '@nestjs/testing';
import { UserService } from './user.service';


describe('UserService', () => {
let service: UserService;

beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
  providers: [UserService],
}).compile();

service = module.get<UserService>(UserService);
});

it('should return user array', async() => {
const result = [{id:1,name:'mayur',phoneNo:'9998814695'}];
// @ts-ignore
jest.spyOn(service,'allUsersList').mockImplementation(() => result); 
expect(await service.allUsersList()).toBe(result);
 });
});

В этом файле я хочу протестировать функцию allUserlist в пользовательской службе, которая возвращает массив пользователя. Пользовательский объект содержит идентификатор, имя и номер телефона. когда я запускаю тест, я получаю сообщение об ошибке

Cannot spyOn on a primitive value; undefined given

  17 |     const result = [{id:1,name:'mayur',phoneNo:'9998814695'}];
  18 |     // @ts-ignore
> 19 |     jest.spyOn(service,'allUsersList').mockImplementation(() => result);
     |          ^
  20 |     expect(await service.allUsersList()).toBe(result);
  21 |   });
  22 | });

Вот моя шутка

{
 "moduleFileExtensions": ["js", "json", "ts"],
 "rootDir": ".",
 "testEnvironment": "node",
 "testRegex": ".spec.ts$",
 "transform": {
 "^.+\\.(t|j)s$": "ts-jest"

},
"automock": true

}

Я пробовал все, пожалуйста, дайте несколько предложений

1 Ответ

0 голосов
/ 10 июля 2020

Здесь я заметил несколько вещей.

  1. вы издеваетесь над классом, который вы тестируете, что означает, что ваши тесты бессмысленны. Вместо этого вы должны издеваться над его зависимостями.

  2. Вы не высмеиваете зависимости своего класса, поэтому Nest не может создать экземпляр класса для вас, что означает, что вы вместо этого получаете undefined класса.

Чтобы исправить это, вам нужно сделать что-то вроде этого:

beforeEach(async () => {
  const modRef = await Test.createTestingModle({
    providers: [
      UserService,
      {
        provide: getRepositoryToken(User),
        useClass: Repository,
      }
    ]
  }).compile();
  service = modRef.get(UserService);
  repository = modRef.get<Repository<User>>(getREpositoryToken(User));
});

И теперь вы можете имитировать методы репозитория, продолжая использовать сервис для тестирования покрытия.

Здесь более подробный ответ и репозиторий, полный тестовых примеров здесь . Не стесняйтесь взглянуть и нырнуть немного глубже.

...