使用 jest 模拟 aws-sdk S3#putObject 实例方法

2024-01-06

对于包含以下内容的源代码:

 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)

也同样失败。


对于源代码

//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);
 })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 jest 模拟 aws-sdk S3#putObject 实例方法 的相关文章

随机推荐

  • 为 Spring Cloud Gateway 配置 CORS 策略

    我在单独的服务器上运行 Spring Cloud 网关 配置如下 spring cloud gateway globalcors cors configurations I also tried allowedOrigins http lo
  • JDBC ResultSet:我需要一个 getDateTime,但只有 getDate 和 getTimeStamp

    我想使用 JDBC 从 Oracle DB 表中获取 DATETIME 列 这是我的代码 int columnType rsmd getColumnType i if columnType Types DATE Date aDate rs
  • Java的隐藏特性

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 看完之后C 的隐藏特性 https stackoverflow com questions 9
  • JavaScript 在 Function 对象上使用 toString 来读取文本内容

    对下面的函数调用 toString 会在浏览器中返回不同的字符串 我理解这是因为 ECMA 262 15 3 4 2 为每个供应商留下了回旋余地 除了所有语法之外 Chrome 还会返回注释 遗憾的是 Firefox 3 6 忽略了这些注释
  • 如何将 Git 中一个分支的特定提交合并到另一个分支?

    I have BranchA提前 113 次提交BranchB 但我只想要最后 10 个左右的提交BranchA并入BranchB 有没有办法做到这一点 The git cherry pick
  • 该图像无法显示,因为它包含错误

    为什么这段代码不起作用
  • React Native Detox 模拟文件

    请有人告诉我模拟文件如何反应本机排毒测试 我关注本文 https github com wix Detox blob master docs Guide Mocking md 我正在使用react native版本0 57 7和detox
  • 从 JRuby 转换 Java 对象

    我正在使用 JRuby 中的 Java 库 我正在从文件中读取一个对象 并且需要将其作为不同的对象类型传递给第二个构造函数 hmm model ObjectInputStream new FileInputStream new LINGPI
  • Bootstrap datetimepicker 禁用分钟

    我正在使用 v4https github com Eonasdan bootstrap datetimepicker https github com Eonasdan bootstrap datetimepicker 现在我试图禁用时间选
  • mongoid 更新数组中的元素

    我正在将 mongoid 3 1 与 Ruby 1 9 3 结合使用 并尝试更新数组中的值 我可以在 mongodb 的 CLI 中成功执行以下命令 但似乎找不到适用于 mongoid 的解决方案 翻译 user update activi
  • 是否存在与堆内存分配相关的内存开销(例如堆中的标记)?

    特别是在 Windows 上使用最新的 Visual Studio C 编译器来考虑 C 我想知道heap执行 假设我使用的是发布编译器 并且我不关心内存碎片 打包问题 是否存在与在heap 如果是这样 每个分配大约有多少字节 会不会更大一
  • λProlog 拒绝假设推理查询?

    我怀疑 Prolog 的主要实现 teyjus 可能有点废弃软件 但 Prolog 是一个令人着迷的 Prolog 它应该让你使用高阶逻辑 假设推理和其他东西 这就是为什么我试图用它 文件 example sig sig example k
  • 使用 NSAlert 处理按下哪个按钮的正确方法是什么

    我已经添加了两个按钮NSAlert对象 目前按钮一的返回码是1001 并且按钮默认为1000 我需要有效地确定按下给定警报中的哪个按钮 而无需使用幻数 否则会变得混乱 void showErrorMessage NSString error
  • Cloudfoundry 是否支持需要更大内存的应用程序?

    我一直在使用 grails 开发一个网站并使用 Cloudfoundry 对其进行演示 Grails 和 Cloudfoundry 太棒了 在 STS 中 grails 插件和工具的支持下 它们易于使用 我的应用程序使用 MySQL Mon
  • 用 Javascript 对象替换窗口或文档对象

    有没有办法替换 窗口 或 文档 对象 我基本上想要的是提供某种 JavaScript 代理 我想防止用户在页面上获取 一些 只有一些 这很重要 DOM 元素 我所说的 用户 是指任何第三个小馅饼脚本 我可以做这个 document getE
  • VBA 正则表达式中的后向查找?

    有没有办法在 VBA 正则表达式中进行负向和正向向后查找 如果字符串以 A 开头 我不想匹配 所以我目前正在模式的开头执行 A 然后删除 match 0 的第一个字符 显然不是最好的方法 我正在使用 regExp 对象 VBA 提供前瞻 正
  • 计算移动设备实际行驶的距离[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想计算移动设备 iOS 和 Android 实际行驶的距离 我知道通过谷歌地图API 我们可以找到2个坐标之间的最佳路线距离 但我想
  • 如何对给定点之间的直线的所有像素位置进行采样?

    我正在做一个项目 其中包括画一条线 但是 最重要的是我需要在每个 X 位置上获取 Y 位置 因此 对于每个 X 我都需要一个 Y 当我缓慢绘制时 绘制一条线并获取位置效果很好 但是当我更快地移动光标时 即使绘制了线 也不会保存每个 X 的位
  • Python 中的凯撒密码函数

    我正在尝试在 Python 中创建一个简单的凯撒密码函数 该函数根据用户的输入移动字母 并在末尾创建一个最终的新字符串 唯一的问题是 最终的密文仅显示最后一个移位的字符 而不是包含所有移位字符的整个字符串 这是我的代码 plainText
  • 使用 jest 模拟 aws-sdk S3#putObject 实例方法

    对于包含以下内容的源代码 const S3 require aws sdk s3 clients const s3 new S3 s3 putObject params callback 我添加了以下模拟基于本文 https faceboo