Шинон следит за обратными вызовами - PullRequest
0 голосов
/ 07 февраля 2020

Мне кажется, что я в целом понимаю, как работает 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 не делает этого, используйте какой-то другой инструмент":)

1 Ответ

1 голос
/ 07 февраля 2020

Вы должны передать callbackSpy функции callbackCaller вместо оригинальной callback. Потому что sinon оборачивает callback шпионом (callbacksSpy), так что вы можете использовать sinon.assert.called для его подтверждения.

index.test.ts:

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(callbackSpy, 'tarfu');
    sinon.assert.called(callbackSpy);
  });
});

Результаты модульного теста :

This seems wrong
Callback called with CallbackCaller called with callback, tarfu
    ✓ should pass but doesn't


  1 passing (6ms)
...