Мне кажется, что я в целом понимаю, как работает sinon, но у меня возникают проблемы с отслеживанием обратного вызова, который передается импортируемой функции, которую я тестирую. Вот пример:
import sinon from 'sinon'
const callbackCaller = (cb: (msg:string) => void, msg: string) => {
cb(`CallbackCaller called with ${cb}, ${msg}`)
}
describe('This seems wrong', () => {
it('should pass but doesn\'t', () => {
const callback = (msg: string) => {
console.log(`Callback called with ${msg}`)
}
const callbackSpy = sinon.spy(callback)
callbackCaller(callback, 'tarfu')
sinon.assert.called(callbackSpy)
})
})
При запуске этот тест печатается, как и ожидалось, но утверждение не выполняется:
$ yarn test:failure
yarn run v1.21.1
$ jest src/test.test.ts
FAIL src/test.test.ts
This seems wrong
✕ should pass but doesn't (8ms)
● This seems wrong › should pass but doesn't
AssertError: expected callback to have been called at least once but was never called
14 |
15 | callbackCaller(callback, 'tarfu')
> 16 | sinon.assert.called(callbackSpy)
| ^
17 | })
18 | })
19 |
at Object.fail (../../../node_modules/sinon/lib/sinon/assert.js:107:21)
at failAssertion (../../../node_modules/sinon/lib/sinon/assert.js:66:16)
at Object.assert.(anonymous function) [as called] (../../../node_modules/sinon/lib/sinon/assert.js:92:13)
at Object.it (test.test.ts:16:22)
console.log src/test.test.ts:10
Callback called with CallbackCaller called with (msg) => {
console.log(`Callback called with ${msg}`);
}, tarfu
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 total
Snapshots: 0 total
Time: 0.815s, estimated 1s
Ran all test suites matching /src\/test.test.ts/i.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Обратите внимание, что обратный вызов действительно вызывается, как это продемонстрировано печать чуть ниже стека трассировки. Я использую версию узла 10.16 и шутку 25.1.0. Поскольку обратный вызов регистрируется после сбоя, похоже, что Jest проверяет шпиона до того, как callbackCaller
вызовет cb
, но там нет асин c, поэтому я немного растерялся. Надеюсь, что решение не "sinon не делает этого, используйте какой-то другой инструмент":)