node.js - 无法窥探原始值;在 nestJS 中给出未定义

标签 node.js unit-testing jestjs nestjs spyon

我知道之前有人问过这个问题,但是当我运行服务测试功能时,我在 nestjs 中遇到了这个错误
这是我的服务代码
用户服务.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);
}
}
用户规范
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 | });
这是我的 Jest 配置
{
 "moduleFileExtensions": ["js", "json", "ts"],
 "rootDir": ".",
 "testEnvironment": "node",
 "testRegex": ".spec.ts$",
 "transform": {
 "^.+\\.(t|j)s$": "ts-jest"

},
"automock": true

}
我尝试了一切请给出一些建议

最佳答案

我注意到这里有几件事。

  • 你在 mock 你正在测试的类(class),这意味着你的测试毫无意义。你应该模拟它的依赖关系。
  • 你不是在 mock 你的类的依赖关系,所以 Nest 不能为你实例化这个类,这意味着你会得到一个 undefined而不是一个类(class)。

  • 要解决此问题,您需要执行以下操作:
    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 .随意看看并深入一点。

    关于node.js - 无法窥探原始值;在 nestJS 中给出未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62829590/

    相关文章:

    node.js - 如何使用 socket.io 发出事件并将函数作为参数传递

    javascript - 为什么函数变得未定义?

    javascript - 正则表达式字边界在 '-' 处中断

    jestjs - Formik,开 Jest ,是的 : how to test validation?

    javascript - 为 nodejs 动态导入添加新扩展

    c# - VSTestHost 正在崩溃并且不再工作

    Python 模拟错误 : stop called on unstarted patcher

    visual-studio - Visual Studio 生成测试

    unit-testing - NestJS:如何在 canActivate 中模拟 ExecutionContext

    javascript - 如何 Jest 获取代码的未覆盖部分