Возврат заглушки синона из заглушки синона

У меня проблемы с получением заглушки 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);
Другие вопросы по тегам