Отключение и / или слежка за необязательной глобальной функцией: Sinon, mocha

#javascript #testing #mocha.js #sinon #chai

#javascript #тестирование #mocha.js #sinon #чай

Вопрос:

У меня есть метод, который проверяет, определена или нет глобальная функция (она может быть доступна, зависит от запроса каждого клиента). Если она определена, она вызовет ее с соответствующими данными. В противном случае произойдет молчаливый сбой. Это желаемое поведение.

Что я хочу сделать, так это протестировать это. Есть ли способ издеваться и / или шпионить libFunction , чтобы я мог убедиться, что она вызывается один раз с правильными данными (функция здесь очень упрощена, по пути происходит некоторая обработка данных).

Вот метод, о котором идет речь:

 function sendData(data) {
  let exists;
  try {
    // eslint-disable-next-line no-undef
    if (libFunction) exists = true;
  } catch (e) {
    exists = false;
  }
  if (exists) {
    // eslint-disable-next-line no-undef
    libFunction(data);
  }
}
  

Я пытался определить libFunction в своих тестах, а затем заглушить это, но это не дает того, что я хочу:

 describe('sendEvent', function () {

  function libFunction(data) {
    console.log('hi', data);
  }

  it('should call libFunction once', function () {
    var stub = sinon.stub(libFunction);
    var data = "testing";
    sendEvent(data);
    expect(stub.called).to.be.true;
  });
});
  

Однако этот тест не пройден: AssertionError: expected undefined to be true

Я пробовал нечто подобное со шпионом:

 describe('sendEvent', function () {

  function libFunction(data) {
    console.log('hi', data);
  }

  it('should call libFunction once', function () {
    var spy = sinon.spy(libFunction);
    var data = "testing";
    sendEvent(data);
    expect(spy.called).to.be.true;
  });
});
  

Это также не удается: AssertionError: expected false to be true

Есть ли способ сделать это?

Комментарии:

1. Вы, вероятно, хотите sinon.spy(window, 'libFunction') , чтобы то, что вы делаете, создавало программу-шпион, поддерживаемую тем, что libFunction не шпионит libFunction .

2. окно не определено, поскольку я не имитирую браузер в своей тестовой среде. есть ли другой способ сделать это?

3. Вы могли бы попробовать global вместо window .

Ответ №1:

Черт возьми, я наткнулся на этот вопрос, пытаясь решить проблему с заглушкой глобального метода в Node. В моем случае это сработало (в моем примере используется Sinon.sandbox , но «обычный» Sinon.spy тоже должен работать):

     const encodeSpy = sandbox.spy(global, "encodeURIComponent");
   // later...
   Sinon.assert.calledWith(encodeSpy, {expectedParamValue});