Как проверить множественный обратный вызов в мокко с помощью sinon? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть функция с асинхронным кодом и несколькими обратными вызовами

var f = (cb1, cb2) => {
  return new Promise((resolve, reject) => { /* ... */ });
};

В моем тесте я создал шпион с помощью sinon

var cb1Spy = sinon.spy();
var cb2Spy = sinon.spy();

Чтобы проверить, что они оба вызваны, у меня естьtest

it('test', (done) => {
  var cbCount = 2;
  var checkIfDone = () => {
    if(--cbCount === 0){
      done()
    }
  };
  f(
    () => { cb1Spy; checkIfDone(); },
    () => { cb2Spy; checkIfDone(); }
  );
});

Работает, но не чувствует себя хорошо.Есть ли лучшие практики по поводу такого рода испытаний?

1 Ответ

0 голосов
/ 30 мая 2018

Обратный вызов done в Mocha специально предназначен для тестирования асинхронного кода и не предназначен для непосредственного контроля за успехом или неудачей.

Ваши основные средства, вызывающие сбой теста, должны быть выброшены объектами Error,в идеале с сообщениями, указывающими причину сбоя. Утверждения - это операторы, которые будут выдавать такие ошибки, если какое-либо конкретное условие не было выполнено.Для этого существует множество библиотек, из которых chai является наиболее популярным, насколько мне известно.

Сам Sinon поставляется с некоторыми утверждениями для использования с егоТест удваивается.Например, если вы хотите утверждать, что cb1Spy был вызван один раз, вы должны написать это:

sinon.assert.calledOnce(cb1Spy);

Если вы в конечном итоге используете chai, есть хороший плагин под названием sinon-chai , который вы можете использовать, чтобы утверждения sinon выглядели более похожими на утверждения chai, придавая вашим тестам более согласованный синтаксис.Если вы используете его, вы можете написать свой тест следующим образом:

const chai = require('chai');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');
const { expect } = chai;
chai.use(sinonChai);

describe('whatever', function() {
    it('test', function() {
        let cb1Spy = sinon.spy();
        let cb2Spy = sinon.spy();

        f(cb1Spy, cb2spy);

        expect(cb1Spy).to.have.been.calledOnce;
        expect(cb2Spy).to.have.been.calledOnce;
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...