诗人间谍功能表达

时间:2016-05-07 17:28:56

标签: javascript unit-testing sinon function-expression

是否可以在函数表达式上创建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上犯错(同样适用于twothree

我在这里缺少什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

调用sinon.spy(fn)不会更改fn,它只会创建一个名为fn函数(间谍)。

为了能够测试onetwothree,您需要用间谍替换这些功能(或者更确切地说,它们的引用),然后将其恢复:< / p>

// 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;

但这并不理想,如果可能的话,我可能会将所有功能组合成一个对象。这也将使Sinon能够恢复原件本身。