Sinon 监视函数表达式
Sinon spy on 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
上得到假(two
和 three
也是如此)
我在这里错过了什么?
谢谢!
调用 sinon.spy(fn)
不会改变 fn
,它只会创建一个 new 函数(间谍),它将调用 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;
但这并不理想,如果可能的话,我可能会将所有功能组合到一个对象中。这样也能让诗乃自己恢复原貌。
是否可以让 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
也是如此)
我在这里错过了什么?
谢谢!
调用 sinon.spy(fn)
不会改变 fn
,它只会创建一个 new 函数(间谍),它将调用 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;
但这并不理想,如果可能的话,我可能会将所有功能组合到一个对象中。这样也能让诗乃自己恢复原貌。