Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js API的NodeJS中的存根DynamoDB_Node.js_Api_Amazon Web Services_Amazon Dynamodb_Stub - Fatal编程技术网

Node.js API的NodeJS中的存根DynamoDB

Node.js API的NodeJS中的存根DynamoDB,node.js,api,amazon-web-services,amazon-dynamodb,stub,Node.js,Api,Amazon Web Services,Amazon Dynamodb,Stub,我有一个问题,存根调用DynamoDB进行API测试。我正在使用无服务器mocha,希望从端到端的角度测试我的API。项目结构并不简单,但在API文件本身中,我单独调用了不同的类文件来实际使用DynamoDB函数。让我们假设它是一个图书馆。 因此,我不能使用aws sdk模拟,因为“aws服务需要在被测试的函数内部初始化,以便模拟sdk方法”不是我的情况。 如何测试我的API和对DynamoDB的存根调用? 现在测试实际上正在工作,但它对数据库进行了真正的调用,我希望避免: const isSt

我有一个问题,存根调用DynamoDB进行API测试。我正在使用无服务器mocha,希望从端到端的角度测试我的API。项目结构并不简单,但在API文件本身中,我单独调用了不同的类文件来实际使用DynamoDB函数。让我们假设它是一个图书馆。 因此,我不能使用aws sdk模拟,因为“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);
});

您考虑过使用DynamoDB Local吗?是的,我考虑过,但是这个解决方案没有那么多灵活性谢谢!非常奇怪,
sinonSandbox.stub(AWS.DynamoDB.DocumentClient.prototype,'put')。返回({promise:()=>{})
不起作用,尽管它几乎是一样的,并且可以用于
查询
。。。