У меня проблема с отказом от вызова 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.info(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.info(response);
expect(response.statusCode).to.equal(201);
});
});
в этом примере я заглушаю реализацию обещания, я считаю, что вы можете заглушить put с помощью обратного вызова следующим образом:
sinonSandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'put').returns((params,callback) => {
callback(null,result);
});
Спасибо! Очень странно, sinonSandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'put').returns({promise: () => {}}); не работал, хотя он почти такой же, и он работал бы с query ...
Вы рассматривали возможность использования DynamoDB Local?