node.js - 使用 Jest 模拟 aws-sdk S3#putObject 实例方法

标签 node.js amazon-s3 mocking jestjs aws-sdk-nodejs

源代码包含:

 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 模式期间,api 的构建方式似乎不同 here . 然而,定义似乎完全不同here

我也尝试过:

  const AWS = require('aws-sdk')
  console.log(AWS.S3.prototype.putObject) // undefined

如果在原型(prototype)上找不到方法,我该如何模拟它?

包装在 Promise 中会破坏结果

我已经将源代码包装在这样的 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.

我认为将调用代码包装在手动 promise 中或使用这样的库:

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', () => {
  return class S3 {
    putObject(params, cb) {
      mockedPutObject(params, 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 实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49187464/

相关文章:

javascript - 错误 : There was an error loading firebase. json : Bolt not installed, 运行 npm install -g firebase-bolt

javascript - IISNode 站点列出文件夹而不是启动 server.js

java - 使用 Mockito 模拟 hibernate 的 SessionFactory 时出现问题

javascript - 数组内的数组

php - 400 错误请求响应 : KeyConditionExpression parameter must be specified in the request

node.js - 在 Meteor 中正确启用 filepicker.io 的安全性

c# - 通过 C# MVC 从 Amazon S3 检索图像

testing - 使用 Selenium 自动测试 UIWebView 内容

firebase - 使用 Jest、Firebase 和 React-Native 运行测试

node.js - 如何在事件监听器中捕获异常?