对于包含以下内容的源代码:
const S3 = require('aws-sdk/s3/clients')
const s3 = new S3()
s3.putObject(params, callback)
我添加了以下模拟基于本文 https://facebook.github.io/jest/docs/en/mock-functions.html#mocking-modules:
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
有/没有模拟,因为 api 似乎在apiLoader
图案here https://github.com/aws/aws-sdk-js/blob/master/clients/s3.js。
然而,定义似乎完全不同here https://github.com/aws/aws-sdk-js/blob/master/clients/s3.d.ts
我也尝试过:
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 › 具有适当的参数 › 应调用 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)
也同样失败。