Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – 使用jest模拟aws-sdk S3#putObject实例方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
对于包含以下内容的源代码

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);
 })

大佬总结

以上是大佬教程为你收集整理的node.js – 使用jest模拟aws-sdk S3#putObject实例方法全部内容,希望文章能够帮你解决node.js – 使用jest模拟aws-sdk S3#putObject实例方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。