Выпуск
tempTable.updateBook
вызывается во время обратного вызова, который не выполняется к тому времени, когда sinon.assert.calledOnce(getTempTableUpdateSpy);
запускается и завершается ошибкой.
Решение
Убедитесь, что у обратного вызова, который вызывает tempTable.updateBook
, была возможность запуска перед утверждением.
Это намного проще при использовании Обещаний, когда Обещание можно вернуть и ожидать в тесте. Этот сценарий более сложный, поскольку существуют обратные вызовы и нет чистого способа вернуть то, что можно ожидать.
Важно отметить, что тест будет оставаться активным до истечения времени ожидания или до вызова done
.
В этом случае похоже, что updateBook
- это последнее, что должно произойти в коде, и последнее, что необходимо проверить. Для подобных сценариев можно обеспечить фиктивную реализацию для заглушки и утверждения, а затем вызвать done
в пределах фиктивной реализации.
Вот упрощенный пример:
import * as sinon from 'sinon';
const tempTable = {
updateBook: () => {}
};
const updateInfo = () => {
setTimeout(() => { tempTable.updateBook(); }, 0); // simulate an asynchronous callback
}
test('updateInfo', (done) => {
const spy = sinon.stub(tempTable, 'updateBook');
spy.callsFake(() => {
sinon.assert.calledOnce(spy); // SUCCESS
done();
});
updateInfo();
});
В вашем случае вы могли бы сделать что-то вроде этого:
it('3. API Call - Errror: 404 - Not found', (done) => {
let getTempTableForUpdateCountSpy = sinon.stub(TempTableDao, "getBookForUpdateCount").yields(jsonResult.count.success.result);
let getTempTableForUpdateSpy = sinon.stub(TempTableDao, "getBookForUpdate").yields(jsonResult.single.failure.result);
let getTempTableUpdateSpy = sinon.stub(TempTableDao, "updateBook");
let test = nock('https://test.api.com/id')
.get('/ID125125/')
.reply(404, {
});
getTempTableUpdateSpy.callsFake(() => {
sinon.assert.calledOnce(getTempTableForUpdateCountSpy);
sinon.assert.calledOnce(getTempTableForUpdateSpy);
test.interceptors[0].statusCode.should.be.equal(404);
sinon.assert.calledOnce(getTempTableUpdateSpy);
done();
});
updateTask.updateInfo();
});