SpyOn TypeORM存储库更改单元测试NestJS的返回值
我想为我的TypeORM数据库调用联合测试角落案例。我已经用有效数据模拟了我所有的TypeORM存储库。但是我想监视存储库并更改TypeORM的返回值。我该怎么做SpyOn TypeORM存储库更改单元测试NestJS的返回值,nestjs,typeorm,Nestjs,Typeorm,我想为我的TypeORM数据库调用联合测试角落案例。我已经用有效数据模拟了我所有的TypeORM存储库。但是我想监视存储库并更改TypeORM的返回值。我该怎么做 从'@nestjs/common'导入{INestApplication}; 从'@nestjs/testing'导入{Test}; 从'@src/common/common.module'导入{CommonModule}; 从“/auth.service”导入{AuthService}; 从“typeorm”导入{Repositor
从'@nestjs/common'导入{INestApplication};
从'@nestjs/testing'导入{Test};
从'@src/common/common.module'导入{CommonModule};
从“/auth.service”导入{AuthService};
从“typeorm”导入{Repository};
从'@src/database/entity/user.v3entity'导入{V3User};
描述('AuthService',()=>{
let服务:AuthService;
let-app:不适用;
beforeach(异步()=>{
const module=await Test.createTestingModule({
导入:[CommonModule.forRoot(`${process.env.DEV_env}`]),
供应商:[
AuthService,
{提供:'V3USER_REPOSITORY',useValue:mockRepositoryV3User()},
],
}).compile();
app=module.createNestApplication();
等待app.init();
service=module.get(AuthService);
});
它('测试身份验证服务-v3数据库中不存在用户',异步()=>{
jest.spyOn(???,'findOne').mockImplementation(()=>未定义);
const res=wait service.login用户(“坏令牌”);
wait expect(service.tokenBasedAuth('example bad token'))
.rejects.toThrow(“坏令牌异常”);
});
});
对于正常的测试用例,我会像这样模拟数据库:
export const mockRepositoryV3User=()=>({
元数据:{
列:[],
关系:[],
},
findOne:async()=>
承诺,决心({
id:3,
电邮:'email@example.com',
名字:“大卫”,
姓:“大卫”,
上次登录:“2019-07-15”,
加入日期:2019-07-15,
}),
});
好吧,在终于开始测试和玩弄创意之后,我发现这是一个有效的策略
PhotoEntity
,没有什么特别的(id、名称、描述等)从'typeorm'导入{Column,Entity,PrimaryGeneratedColumn};
@实体()
出口级照片{
@PrimaryGeneratedColumn()
id:编号;
@列({length:500})
名称:字符串;
@列(“文本”)
描述:字符串;
@第()列
文件名:字符串;
@列('int')
意见:数目;
@第()列
已发布:布尔值;
}
PhotoService
,如下所示(超级基本,但它将说明这一点):从'@nestjs/common'导入{Injectable};
从'@nestjs/typeorm'导入{InjectRepository};
从“typeorm”导入{Repository};
从“./Photo.entity”导入{Photo};
@可注射()
导出类光服务{
建造师(
@(图片)
专用只读光电存储:存储库,
) {}
异步findAll():承诺{
返回等待此。Photopository.find();
}
}
useClass:Repository
,这样我们就不必设置用于测试的存储库类(存储库是从TypeORM包导入的。然后我们可以从模块中获取repo,并将其保存为易于模拟的值,然后像这样设置我们的测试:从'@nestjs/testing'导入{Test,TestingModule};
从“/photo.service”导入{PhotoService};
从'@nestjs/typeorm'导入{getRepositoryToken};
从“./Photo.entity”导入{Photo};
从“typeorm”导入{Repository};
描述('PhotoService',()=>{
让服务:PhotoService;
//声明repo变量以便于以后访问
let repo:存储库;
beforeach(异步()=>{
常量模块:TestingModule=等待测试。createTestingModule({
供应商:[
光服务,
{
//如何在测试实例中提供注入令牌
提供:getRepositoryToken(照片),
//作为类值,存储库不需要泛型
useClass:存储库,
},
],
}).compile();
service=module.get(PhotoService);
//保存存储库的实例并设置正确的泛型
repo=module.get(getRepositoryToken(照片));
});
它('应该定义',()=>{
expect(service.toBeDefined();
});
它('应该返回findAll',async()=>{
//重复使用的模拟文件
常数测试照片:照片={
id:'a47ecdc2-77d6-462f-9045-c440c5e4616f',
姓名:'你好',
描述:'描述',
我发表:对,
文件名:“testFile.png”,
意见:5,,
};
//注意,我们正在拉取repo变量并使用jest.spyOn,没有任何问题
jest.spyOn(repo,'find').mockResolvedValueOnce([testPhoto]);
expect(wait service.findAll()).toEqual([testPhoto]);
});
});
▶ npm运行测试--photo.service
>内斯特-playground@0.0.1test~/Documents/code/nestjs
>笑话“照片服务”
通过src/photo/photo.service.spec.ts
光服务
✓ 应定义(17ms)
✓ 应返回findAll(4ms)<--测试通过,没有问题
测试套件:1个通过,共1个
测试:2次通过,共2次
快照:共0个
时间:3.372s,估计4s
运行与/photo.service/i匹配的所有测试套件。
非常好。工作完美。如何测试查询是否类似于.createQueryBuilder('image').offset(pagination.offset)。limit(pagination.limit)。getManyAndCount();对于类似的情况,您需要大量的mockReturnThis()
一种jest函数,最后一个函数是mockresolvedValue()
。你可能最终会有几个模拟或间谍,每个都有一个,并减去最后一个on,所以是一个jest.spyOn(repo,'createQueryBuilder')
,一个