У меня есть лямбда-функция AWS:
exports.handler = function(event, context, callback) {
const myModel = exports.deps().myModel;
return tools.checkPermission(event)
.then((id) => myModel.create(JSON.parse(event.body), id))
.then((campaign) =>
tools.handleAPIResponse(
callback,
data,
201,
Object.assign({Location: event.path + '/' + data.id,}, tools.HEADERS)
)
).catch(err => tools.handleAPIError(callback, err));
};
Я пишу тестовый пример, используя sinon.js, просто чтобы проверить, были ли вызваны все методы в моей лямбда-функции путем заглушки всех функций. как
myModel.create
tools.checkPermission
tools.handleAPIError
tools.handleAPIResopnse
Я заглушаю и тестирую так:
it('should call all functions ', () => {
const event = {};
createMyStub = sinon.stub(myModel, 'create');
createMyStub.withArgs(sinon.match.any).returns(Promise.resolve('Hello'));
const checkPermission = sinon.stub(tools, 'checkPermission');
checkPermission.withArgs(sinon.match.any).returns(Promise.resolve('user'));
const handleAPIResponse = sinon.stub(tools, 'handleAPIResponse');
handleAPIResponse.withArgs(sinon.match.any).returns('Done');
const callback = sinon.spy();
API.handler(event, {}, callback);
expect(checkPermission.called).to.be(true);
expect(handleAPIResponse.called).to.be(true);
expect(createMyStub.called).to.be(true);
createMyStub.restore();
checkPermission.restore();
handleAPIResponse.restore();
});
Но я не получаю ожидаемых результатов. Кроме того, как я могу увидеть содержимое обратного вызова, если я не заглушаю tools.handleAPIResponse и ожидаю фактического результата в обратном вызове.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я заметил одну важную ошибку в вашем тесте в этой части
API.handler(event, {}, callback);
эта функция является асинхронной, поэтому мы должны называть ее обещанием, например
await API.handler(event, {}, callback);
или альтернативно
API.handler(event, {}, callback).then(....)
Я предпочитаю первый подход. А также некоторые части тестов можно улучшить, например, используя sinon.resolves и sinon.restore, как показано ниже:
it('should call all functions ', async () => { // specify `async`
const event = {};
createMyStub = sinon.stub(myModel, 'create');
createMyStub.withArgs(sinon.match.any).resolves('hello'); // using `resolves`
const checkPermission = sinon.stub(tools, 'checkPermission');
checkPermission.withArgs(sinon.match.any).resolves('user')
const handleAPIResponse = sinon.stub(tools, 'handleAPIResponse');
handleAPIResponse.withArgs(sinon.match.any).returns('Done');
const callback = sinon.spy();
await API.handler(event, {}, callback); // specify `await`
expect(checkPermission.called).to.be(true);
expect(handleAPIResponse.called).to.be(true);
expect(createMyStub.called).to.be(true);
sinon.restore(); // this is sufficient in latest version of sinon, no need to restore on all methods
});
Что касается вашего вопроса о проверке обратного вызова, возможно, мы можем использовать sinon.calledWith, например:
expect(handleAPIResponse.calledWith(callback, ...).to.be(true);
Ссылка:
Надеюсь, поможет
Я пытался использовать это решение, но expect(handleAPIResponse.call).to.be(true); ожидать(создатьMyStub.вызывается).быть(истина); всегда возвращают false. Кроме того, заглушка этих функций в этом тестовом примере мешает модульным тестам фактического объекта инструментов.
@Bharthan, в чем myModel ценность этой строки createMyStub = sinon.stub(myModel, 'create');?
myModel — это объект класса, который обращается к базе данных. Итак, myModel.create(JSON.parse(event.body), id) создает новую запись в базе данных. В случае успеха он возвращает обещание с вставленным data в качестве содержимого.
@Бхартан классный. В вашем источнике myModel происходит от const myModel = exports.deps().myModel;, а как насчет теста? Я этого не видел.
каков результат вашего теста?