无法窥探原始值;在nestJS中给定的未定义
Posted
技术标签:
【中文标题】无法窥探原始值;在nestJS中给定的未定义【英文标题】:Cannot spyOn on a primitive value; undefined given in 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
我都试过了,请给点建议
【问题讨论】:
【参考方案1】:我在这里注意到了几件事。
您在嘲笑您正在测试的课程,这意味着您的测试毫无意义。您应该改为模拟它的依赖关系。
您没有模拟类的依赖关系,因此 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 here 和a repository full of test examples here。随意看看并深入了解一下。
【讨论】:
【参考方案2】:您的 allUsersList
将在 service
中的 prototype
下结束,请尝试
jest.spyOn(service.prototype,'allUsersList').mockImplementation(() => result);
【讨论】:
这对我有用,但作为旁注,.prototype
必须添加到导入的类本身,而不是它的对象上。所以在问题的情况下,应该是:jest.spyOn(UserService.prototype,'allUsersList').mockImplementation(() => result)
以上是关于无法窥探原始值;在nestJS中给定的未定义的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:无法读取从带有已定义模板的 JSON 文件中读取的未定义属性(读取“array_google”)
NestJS:无法读取未定义的属性“'createObjectLiteralExpression'”
在 PHPUnit 中实现给定接口的模拟对象上的未定义方法?