【问题标题】:sinon.getCall(0).args[0] is returning the result of the function, not first argsinon.getCall(0).args[0] 正在返回函数的结果,而不是第一个 arg
【发布时间】:2017-08-03 22:01:54
【问题描述】:

我正在使用 AVA 和 Sinon 测试一个小功能。函数看起来基本上是这样的(为简洁起见进行了编辑):

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]

返回从第 n 次调用该函数时传递给该函数的第 m 个参数。但是,在这种情况下,日志 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] 又名“log 2”实际上返回了_.defaultsDeep 运行后“opts”变成的内容。我做错了什么?

【问题讨论】:

    标签: javascript testing lodash sinon ava


    【解决方案1】:

    您遇到的根本问题是对参数的引用(在本例中为 opts)与您使用值操作的对象相同(因为所有对象在 JavaScript 中都是通过引用传递的)。实际上,您正在更改opts 指向的物理位置。

    由于 Sinon 不会获取您传入的对象的“快照”或“副本”(它只返回您传入的相同对象引用),因此您也会影响 Sinon 返回的内容。

    要解决这个问题,代码应该类似于

    mergeDefaults: function (opts) {
        return _.defaultsDeep(Object.assign({}, opts), defaultOptions);
    }
    

    Object.assign 将创建一个新对象(以及相关的内存位置)。因此,opts 将保持不变,因此您可以检查传入的内容。

    【讨论】:

    • 真的不用Object.assign。它基本上已经在这样做了。只需给它一个空对象即可填充:return _.defaultsDeep({}, opts, defaultOptions); }
    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多