lev*_*4ka 4 api stub amazon-web-services node.js amazon-dynamodb
我有一个问题来存根对 DynamoDB 的调用以进行 API 测试。我正在使用无服务器 mocha 并希望从端到端的角度测试我的 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);
});
| 归档时间: | 
 | 
| 查看次数: | 2188 次 | 
| 最近记录: |