Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SpyOn TypeORM存储库更改单元测试NestJS的返回值_Nestjs_Typeorm - Fatal编程技术网

SpyOn TypeORM存储库更改单元测试NestJS的返回值

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

我想为我的TypeORM数据库调用联合测试角落案例。我已经用有效数据模拟了我所有的TypeORM存储库。但是我想监视存储库并更改TypeORM的返回值。我该怎么做

从'@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')
    ,一个