NodeJS 中用于 API 的存根 DynamoDB

2024-01-12

我在存根 DynamoDB 调用以进行 API 测试时遇到问题。我正在使用无服务器摩卡,想要从端到端的角度测试我的 API。项目结构并不简单,但在 API 文件本身内部,我对不同的类文件进行了单独的调用,以实际使用 DynamoDB 函数。让我们假设它是一个图书馆。 因此,我无法使用 aws-sdk-mock,因为“需要在正在测试的函数内初始化 AWS 服务才能模拟 SDK 方法”的要求不是我的情况。 如何测试我的 API 并存根对 DynamoDB 的调用? 现在测试实际上正在工作,但它真正调用了我想避免的数据库:

const isStub = true;

const mochaPlugin = require('serverless-mocha-plugin');
const chaiExclude = require('chai-exclude');

const sinon = require('sinon');

mochaPlugin.chai.use(chaiExclude);

const expect = mochaPlugin.chai.expect;
const assert = mochaPlugin.chai.assert;

let createHandler = mochaPlugin.getWrapper('postStory', '/../../functions/create/create.js', 'handler');

const { constants } = require('core/index');

const localConstants = require('../utils/constants');

const AWS = require('aws-sdk');
const AWSMock = require('aws-sdk-mock');

describe('create', () => {

    let dynamoSpy = sinon.spy();

    before((done) => {
        if (isStub) {
            AWSMock.mock('DynamoDB.DocumentClient', 'put', dynamoSpy);
        }
        done();
    });
    after((done) => {
        if (isStub) {
            assert.isTrue(dynamoSpy.calledOnce, 'should make at least one call to DynamoDB via AWS SDK');
            AWSMock.restore('DynamoDB.DocumentClient', 'put');
            sinon.reset();
        }
        done();
    });

    it('should pass object with correct values to save', function () {
        return createHandler.run(require('../events/create/create.json')).then((response) => {
            console.log(response);
            expect(response.statusCode).to.equal(201);
        });
    });

我遇到了同样的问题,我通过使用 sinon 解决了它,请查看如何存根 Dynamo 函数,然后测试你想要的任何内容:

import {expect} from 'chai';
import * as AWS from 'aws-sdk';
import * as sinon from 'sinon';

let result = {
  // your result
}
let sinonSandbox;

beforeEach((done) => {
    sinonSandbox = sinon.createSandbox();
    done();
})

afterEach((done) => {
    sinonSandbox.restore()
    done();
})

it('your test', async () => {
    sinonSandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'put').returns({
        promise: function () {
            return Promise.resolve(result);
        }
    });

    return createHandler.run(require('../events/create/create.json')).then((response) => {
        console.log(response);
        expect(response.statusCode).to.equal(201);
    });
});

在此示例中,我对 Promise 实现进行了存根,我相信您可以使用如下回调对 put 进行存根:

sinonSandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'put').returns((params,callback) => {
    callback(null,result);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NodeJS 中用于 API 的存根 DynamoDB 的相关文章

随机推荐

  • 如何在数据网格中将转换后的字节数组显示为图像

    我希望能够在我的数据网格中显示图像 我正在从 SQL 数据库中提取所有信息 图像以字节数组的形式存储在数据库中 我很确定我已经弄清楚如何从字节数组转换回图像的部分 现在我正在尝试弄清楚如何在转换后在网格中显示图像 任何帮助 将不胜感激 谢谢
  • 如何将 React.memo 应用于数组中的所有组件?

    是否可以通过 for 循环将 React memo 应用于组件数组 假设我有以下三个组成部分 const Item1 props gt const index props return div index div const Item2 p
  • 将each_with_index与map一起使用

    我想获取一个数组并将其设为订单列表 目前我正在尝试这样做 r a b c r each with index w index puts index 1 w map to a 1 a 2 b 3 c gt a b c 输出应该是 1 a 2
  • 从 python 脚本将文件上传到我的保管箱

    我想自动将文件从 python 脚本上传到我的 Dropbox 帐户 无论如何 我找不到只用用户 通行证来做到这一点 我在 Dropbox SDK 中看到的所有内容都与具有用户交互的应用程序相关 我只想做这样的事情 https api co
  • 如何正确安装 IntelliJ IDEA 的 Google Java Format 插件?

    我想安装IntelliJ IDEA 的 Google Java 格式插件 https plugins jetbrains com idea plugin 8527 google java format 我有最新的 2016 年社区版版本 版
  • laravel 未定义的偏移量:0

    我试图显示一条错误消息 以防所选字段在数据库中重复 为此 我使用 laravel 验证需要唯一 我在重定向时遇到问题 这是商店控制器 public function store rules array car gt array requir
  • 在 aws athena 中按日期时间查询解析 alb 日志时出错

    我已按照链接中提到的步骤在 Athena 中创建 ALB 表 我试图根据日期时间查询日志 但出现以下错误 Query SELECT client ip sum received bytes FROM default alb logs WHE
  • Java JTextArea KeyListener

    当我按下 ENTER 时 我的 JTextArea 开始一个新行 我只想对 doClick 方法执行其他操作 我该怎么做呢 textarea addKeyListener new KeyListener Override public vo
  • 在 AWS CloudFront 上启用 POST/PUT/DELETE?

    在 AWS CloudFront 中 我在 默认缓存行为设置 区域中的 允许的 HTTP 方法 中进行了设置 GET HEAD OPTIONS PUT POST PATCH DELETE 我的 CloudFront 链接到 AWS S3 存
  • 带有 .htaccess 的 HTTP 缓存标头

    我正在尝试配置我的 htaccess 文件来设置缓存时间 尝试了所有可能的配置 但没有任何效果 这是我的 HTML 中写的内容 这是我的 htaccess 文件中写入的内容 ExpiresActive On ExpiresDefault A
  • Python:从列表中删除奇数

    我编写了一个函数来从列表中删除奇数 如下所示 def remove odd l for i in l if i 2 0 l remove i print l return l remove odd 4 5 4 remove odd 4 5
  • 在 java(w).exe 进程列表中查找 .jar 的名称

    在我的公司环境中 这个脚本在大量计算机上运行 我偶尔会要求用户杀死该脚本 因为众所周知它有时会锁定 我正在想办法自己杀死它 我注意到我可以使用远程列出pslist然后使用杀死它pskill 现在的问题是 当有人运行多个 java 应用程序
  • 转换为自动引用计数 (ARC):“使用未声明的标识符”错误

    在一个非常大的项目中 我到处都使用了自动合成的属性 MyClass h file interface MyClass NSObject property nonatomic retain NSString deviceName proper
  • 如何直接从 UIWebView 将登录信息传递到网站而不需要再次登录?

    我想使用 UIWebView 在我的 iPhone 应用程序中打开一些网站 该网站需要用户名和密码 我有这些用户名和密码 我想知道是否可以在 UIWebView 中打开网站而无需任何登录屏幕 我的意思是 因为我已经有了用户名和密码 我可以使
  • 如何防止 Java 中出现 403 HTTP 错误代码?

    我使用简单的代码来获取htmlhttp www ip adress com http www ip adress com 但它显示错误http代码403 我在其他网站 例如google com 的程序中尝试过 它可以工作 我也可以在浏览器中
  • 如何使用 R formattable 包更改表标题行的外观

    我正在使用 R 中的 formattable 包来生成 HTML 表 我可以使用格式化程序来自定义表中数据值的外观 例如字体大小 颜色等 但我不知道如何更改表标题行的外观 我可以使用 col names 更改实际的列名称 但无法更改它们的外
  • 在java中获取模式值

    有人知道如何从数组中获取模式值吗 例如 如果我有一个数字不同的数组 我如何使用Java来查找出现次数最多的数字 完成时间为 O n 而不是 O n 2 需要长度 gt 0 的数组 public static int getMode int
  • 在 GDB 中创建 C++ 字符串

    我在创建时遇到问题std string 或者任何 C 对象 我猜 在 GDB 中 我尝试了以下多种变体 但似乎都不起作用 gdb p std string hello A syntax error in expression near he
  • 迭代 json 对象来绘制柱形图?

    I use google load visualization 1 packages columnchart google setOnLoadCallback drawChart function drawChart response al
  • NodeJS 中用于 API 的存根 DynamoDB

    我在存根 DynamoDB 调用以进行 API 测试时遇到问题 我正在使用无服务器摩卡 想要从端到端的角度测试我的 API 项目结构并不简单 但在 API 文件本身内部 我对不同的类文件进行了单独的调用 以实际使用 DynamoDB 函数