【问题标题】:Cannot spyOn on a primitive value; undefined given in nestJS无法窥探原始值;在nestJS中给定的未定义
【发布时间】:2020-10-30 22:01:57
【问题描述】:

我知道之前有人问过这个问题,但是当我运行服务测试功能时,我在 Nestjs 中遇到了这个错误

这是我的服务代码

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.spec.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 函数。 用户实体包含 id、name 和 phoneNo。 当我运行测试时,我收到类似的错误

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

}

我都试过了,请给点建议

【问题讨论】:

    标签: node.js unit-testing jestjs nestjs spyon


    【解决方案1】:

    我在这里注意到了几件事。

    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));
    });
    

    现在您可以在仍然使用服务测试覆盖率的同时模拟存储库方法。

    有一个more in depth answer herea repository full of test examples here。随意看看并深入了解一下。

    【讨论】:

      【解决方案2】:

      您的 allUsersList 将在 service 中的 prototype 下结束,请尝试

      jest.spyOn(service.prototype,'allUsersList').mockImplementation(() => result); 
      

      【讨论】:

      • 这对我有用,但作为旁注,.prototype 必须添加到导入的类本身,而不是它的对象上。所以在问题的情况下,应该是:jest.spyOn(UserService.prototype,'allUsersList').mockImplementation(() =&gt; result)
      猜你喜欢
      • 2021-11-02
      • 2020-12-06
      • 2020-02-24
      • 2021-07-05
      • 2020-06-11
      • 2021-10-30
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      相关资源
      最近更新 更多