我正在测试一个使用AVA和Sinon的小函数。功能基本上看起来像这样(编辑为简洁起见):sinon.getCall(0).args [0]返回函数的结果,而不是首先arg
mergeDefaults: function (opts) {
**console.log('log 1 ->', opts);**
opts = _.defaultsDeep(opts, defaultOptions);
return opts;
}
我写了一个测试,以确保正确的参数传递到_.defaultsDeep。
test.before(t => {
sandbox = sinon.sandbox.create();
defaultsDeepSpy = sandbox.spy(_, 'defaultsDeep');
mergeDefaults(Object.assign({}, testOptions));
});
test('mergeDefaults runs _.defaultsDeep with the correct parameters', t => {
**console.log('log 2 ->', defaultsDeepSpy.getCall(0).args[0]);**
t.is(defaultsDeepSpy.getCall(0).args[0], testOptions);
t.is(defaultsDeepSpy.getCall(0).args[1], defaultOptions);
});
test.after.always(t => {
sandbox.restore();
});
我遇到的问题是,日志1和日志2是不一样的。据我所知,
spy.getCall(n).args[m]
返回传递给spied on函数从第n次调用该函数的第m个参数。然而,在这种情况下,log 2实际上是返回函数的结果,而不是第一个参数。
的选择对象是这个样子:
testOptions = {
key1: 11,
key2: 22,
key3: 33
}
defaultOptions = {
key1: 1,
key2: 2,
key3: 3,
key4: 4,
key5: 5
}
但console.logs这个样子:
log 1 -> testOptions = {
key1: 11,
key2: 22,
key3: 33
}
log 2 -> testOptions = {
key1: 11,
key2: 22,
key3: 33,
key4: 4,
key5: 5
}
所以spy.getCall(0).args [0]又名“日志2“实际上是在_.defaultsDeep运行之后返回”opts“变成的。这感觉就像是Sinon库中的一个bug,但更可能是我做错了什么。非常感谢帮助,感谢先进!