Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.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
Javascript 如何开玩笑地模仿S3?_Javascript_Amazon S3_Jestjs_Nestjs_Aws Sdk Nodejs - Fatal编程技术网

Javascript 如何开玩笑地模仿S3?

Javascript 如何开玩笑地模仿S3?,javascript,amazon-s3,jestjs,nestjs,aws-sdk-nodejs,Javascript,Amazon S3,Jestjs,Nestjs,Aws Sdk Nodejs,我正在尝试为上传编写测试代码。 但我并不低估如何正确使用jest.mock('aws-sdk') 导出类服务{ 私有只读s3:s3; 私有只读存储桶:字符串; 构造函数(专用只读configService:configService){ this.s3=新的s3({ accessKeyId:this.configService.get(“”), secretAccessKey:this.configService.get(“”), 区域:this.configService.get(“”), }

我正在尝试为上传编写测试代码。 但我并不低估如何正确使用
jest.mock('aws-sdk')

导出类服务{
私有只读s3:s3;
私有只读存储桶:字符串;
构造函数(专用只读configService:configService){
this.s3=新的s3({
accessKeyId:this.configService.get(“”),
secretAccessKey:this.configService.get(“”),
区域:this.configService.get(“”),
});
this.bucket=this.configService.get(“”);
}
异步上传(名称:string,内容类型:string,缓冲区:buffer):承诺{
const upload=wait this.s3.upload({params…}).promise();
返回上传;
}
}

以下是单元测试解决方案:

s3Service.ts

从“aws sdk”导入{S3};
出口类服务{
私有只读s3:s3;
私有只读存储桶:字符串;
构造函数(专用只读配置服务){
this.s3=新的s3({
accessKeyId:this.configService.get(“”),
secretAccessKey:this.configService.get(“”),
区域:this.configService.get(“”),
});
this.bucket=this.configService.get(“”);
}
公共异步上载(名称:string,contentType:string,buffer:buffer):承诺{
const bucket=this.bucket;
const params={Bucket:Bucket,Key:'Key',Body:buffer};
const upload=等待这个.s3.upload(params.promise();
返回上传;
}
}
s3Service.test.ts

从“/S3Service”导入{S3Service};
常量mS3Instance={
上传:jest.fn().mockReturnThis(),
promise:jest.fn(),
};
jest.mock('aws-sdk',()=>{
返回{S3:jest.fn(()=>mS3Instance)};
});
描述('61830632',()=>{
它('应该正确上传',异步()=>{
常量配置服务={
开玩笑
.fn()
.mockReturnValueOnce('accessKeyId'))
.mockReturnValueOnce('secretAccessKey'))
.mockReturnValueOnce(“美国东部”)
.mockReturnValueOnce('bucket-dev'),
};
mS3Instance.promise.mockResolvedValueOnce(“假响应”);
const s3Service=新的s3Service(configService);
const actual=wait s3Service.upload('name','contentType',Buffer.from('ok'));
expect(实际).toEqual(“假响应”);
expect(mS3Instance.upload).toBeCalledWith({Bucket:'Bucket dev',Key:'Key',Body:Buffer.from('ok')});
});
});
100%覆盖率的单元测试结果:

PASS stackoverflow/61830632/s3Service.test.ts(11.362s)
61830632
✓ 应正确上传(6ms)
--------------|---------|----------|---------|---------|-------------------
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s
--------------|---------|----------|---------|---------|-------------------
所有文件| 100 | 100 | 100 | 100 |
s3Service.ts | 100 | 100 | 100 | 100 |
--------------|---------|----------|---------|---------|-------------------
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:12.738秒
这是我的解决方案-

jest.mock('aws-sdk', () => {
class mockS3 {
    getSignedUrl(op, obj) {
        return 'url'
    }
}
return {
    ...jest.requireActual('aws-sdk'),
    S3: mockS3
}

})

谢谢你的说明性回答。从概念上讲,
jest.fn().mockReturnThis()做什么?它能让你连电话吗?@cischa是的。它允许您链接调用。@slideshowp2在我的测试中复制您的代码会从jest:ReferenceError:…/\uuuu tests\uuuu/user\u handler.spec.ts返回此错误:
jest.mock()
的模块工厂不允许引用任何超出范围的变量。无效变量访问:mS3Instance允许的对象:数组、ArrayBuffer、原子、BigInt、BigInt64Array、Bigint64数组、布尔值、缓冲区、DTRACE\u HTTP\u客户端请求、DTRACE\u HTTP\u客户端响应、DTRACE\u HTTP\u服务器请求、DTRACE\u HTTP\u服务器响应、DTRACE\u网络\u服务器连接、DTRACE\u网络\u流\u端、数据视图、日期、错误、评估、,这只是一个警告。将
mS3Instance
重命名为以
mock
开头的内容-例如
mockS3