Возврат заглушки синона из заглушки синона
У меня проблемы с получением заглушки sinon для возврата / разрешения другой заглушки sinon. Я использую sinon, chai, chai-as-обещанный и мокко.
Я последовательно выполняю ряд асинхронных задач, и код, который я хочу проверить, выглядит примерно так:
Terminal.findOneAsync({terminalId: terminalId}).then(function(terminal) {
terminal.lastSeen = timestamp;
return terminal.saveit();
}).then(function(terminal) {
//continue to do other stuff
});
И моя попытка создать заглушки для этого выглядит так:
var saveitStub = sinon.stub(Terminal.prototype, 'saveit');
saveitStub.resolves(terminalUpdated);
var findOneStub = sinon.stub(Terminal, 'findOneAsync');
findOneStub.resolves(saveitStub);
Метод saveit находится в Terminal.prototype, поэтому мне нужно его заглушить. Когда я пытаюсь запустить это, я получаю ошибку:
Unhandled rejection TypeError: undefined is not a function
на линии:
return terminal.saveit();
Но если я выгружаю терминальный объект в консоль, он выглядит нормально, как и любой другой объект-заглушка (по крайней мере, на мой взгляд). Заглушенный метод saveit() можно назвать "автономным" в тесте. Но всякий раз, когда я возвращаю его с помощью методов "возврата" или "разрешения", я получаю эту ошибку.
Есть идеи, почему это так?
1 ответ
Эта строка:
findOneStub.resolves(saveitStub)
Вызывает Terminal.findOneAsync
чтобы вернуть функцию-заглушку, а не экземпляр терминала. Очевидно, функция-заглушка не имеет свойства с именем saveit
, даже если Terminal.prototype
делает. Поскольку неизвестные свойства возвращаются как undefined
это заканчивается тем, что вы пытаетесь вызвать undefined
как функция.
Чтобы сделать такой тест, вам, вероятно, лучше создать экземпляр Terminal
и заглушить его saveit
метод. Если по какой-либо причине создание экземпляра слишком сложно, вы можете использовать sinon.createStubInstance
, Поскольку я не знаю подписи вашего конструктора, я продолжу и сделаю это в качестве примера:
var terminal = sinon.createStubInstance(Terminal);
var saveitStub = terminal.saveit
saveitstub.resolves(terminalUpdated)
var findOneStub = sinon.stub(Terminal, 'findOneAsync')
findOneStub.resolves(terminal);