Синон следит за выражением функции

Возможно ли сделать так, чтобы sinon следил за функциональными выражениями? Посмотрите этот код для примера.

function one() { return 1; }
function two() { return 2; }
function three() { return 3; }

function myMethod() {
  var n1 = one();
  var n2 = two();
  var n3 = three();
  return n1 + n2 + n3;
}


QUnit.module('My test');

QUnit.test('testing functions', (assert) => {
  assert.expect(3);
  
  const spyOne = sinon.spy(one);
  const spyTwo = sinon.spy(two);
  const spyThree = sinon.spy(three);
 myMethod();

  assert.ok(spyOne.called, "called one");
  assert.ok(spyTwo.called, "called two");
  assert.ok(spyThree.called, "called three");
  
  sinon.restore();
});

Хотя я звоню myMethod() и у меня есть шпионы на one - two - three Я все еще ложь на one.called (то же самое для two а также three)

Что мне здесь не хватает?

Спасибо!

1 ответ

Решение

Призвание sinon.spy(fn) не меняется fn, он просто создает новую функцию (шпион), которая будет вызывать fn,

Для вас, чтобы иметь возможность проверить one, two, threeВам необходимо заменить эти функции (или, скорее, их ссылки) на шпионов, а затем восстановить их:

// keep references to the original functions
var _one   = one;
var _two   = two;
var _three = three;

// replace the original functions with spies
one   = sinon.spy(one);
two   = sinon.spy(two);
three = sinon.spy(three);

// call our method
myMethod();

// test
assert.ok(one.called,   "called one");
assert.ok(two.called,   "called two");
assert.ok(three.called, "called three");

// restore the original functions
one   = _one;
two   = _two;
three = _three;

Хотя это не идеально, и, если возможно, я бы сгруппировал все функции в объект. Это также позволило бы Синону восстановить сами оригиналы.

Другие вопросы по тегам