Skip to main content
 首页 » 编程设计

node.js之NodeJS 中用于 API 的 stub DynamoDB

2024年02月06日147arxive

我在 stub DynamoDB 调用以进行 API 测试时遇到问题。我正在使用无服务器摩卡,想要从端到端的角度测试我的 API。项目结构并不简单,但在 API 文件本身内部,我对不同的类文件进行了单独的调用,以实际使用 DynamoDB 函数。让我们假设它是一个图书馆。 因此,我无法使用 aws-sdk-mock,因为“需要在正在测试的函数内初始化 AWS 服务才能模拟 SDK 方法”的要求不是我的情况。 如何测试我的 API 并 stub 对 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 解决了它,请查看如何 stub 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 实现进行了 stub ,我相信您可以使用如下回调对 put 进行 stub :

sinonSandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'put').returns((params,callback) => { 
    callback(null,result); 
});