对于包含以下内容的源代码
const S3 = require('aws-sdk/s3/clients') const s3 = new S3() s3.putObject(params,callback)
我添加了以下基于this article的模拟:
jest.mock('aws-sdk/s3/clients') const S3 = require('aws-sdk/s3/clients') it('has to mock S3#putObject',() => { S3.prototype.putObject.mockImplementation(() => cb()) })
但我找不到带有/不带模拟的S3.prototype.putObject,因为在apiLoader模式here期间api似乎是以不同的方式构建的.
但是,定义似乎完全不同here
我也尝试过:
const AWS = require('aws-sdk') console.log(AWS.S3.prototype.putObject) // undefined
如果我在原型上找不到它,我怎么能模拟一个方法呢?
在承诺中包装打破了结果
我已将源代码包装在Promise中,如下所示:
new Promise((resolve,reject) => { s3.putObject(params,(err,data) => { if (err) { reject(err) } else { resolve(data) } }) })
并使用如下所示的测试:
const mockedPutObject = jest.fn(); jest.mock('aws-sdk/s3/clients',() => { return class S3 { putObject(params,cb) { mockedPutObject(params,cb); } } }); it('should call aws S3.putObject method',async () => { const data = { Bucket: 'aaa',Key: 'bbb',Content: 'this can be anything',ACL: 'public-read' } await putObject(data) console.log(mockFn.calls) expect(mockFn).toBeCalledWith(data) })
导致错误的putObject> with params>应该调用aws S3.putObject方法
Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout.
我认为将调用代码包装在手动承诺中或使用如下的库:
const {promisify} = require('es6-promisify') const putS3Object = promisify(s3.putObject.bind(s3)) return putS3Object(data)
同样也失败了.
解决方法
对于源代码
//src.js const S3 = require('aws-sdk/clients/s3'); const s3 = new S3(); const putFunction = () => { s3.putObject(params,callback); } export default putFunction;
以下方法可用于模拟S3客户端的putObject方法.
const mockedPutObject = jest.fn(); jest.mock('aws-sdk/clients/s3',cb); } } }); it('has to mock S3#putObject',() => { const putFunc = require('./src).default.putFunc; putFunc(); expect(mockedPutObject).toHaveBeenCalledWith(params,callback); })
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。