Вы можете использовать слияние Lodash :
var object = {
'a': [{ 'b': 2 }, { 'd': 4 }]
};
var other = {
'a': [{ 'c': 3 }, { 'e': 5 }]
};
_.merge(object, other);
// => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
Некоторая реструктуризация может сделать эту работу.
Я использовал синтаксис commonJS. Также должен работать аналогично в ES6.
foo.js
const factory = {
a,
b,
}
function a() {
return 2;
}
function b() {
return factory.a();
}
module.exports = factory;
test.js
const ser = require('./foo');
const sinon = require('sinon');
const aStub = sinon.stub(ser, 'a').returns('mocked return');
console.log(ser.b());
console.log(aStub.callCount);
Выход
< blockquote>mocked return
1
blockquote>Несмотря на то, что вышеописанное работает, это, безусловно, обходной путь, так как мой линтер быстро сообщил.
Я закончил разделение модулей и использовал proxyquire . Эта библиотека позволяет вам легко подставлять любой / любой экспорт в зависимости от ваших предпочтений, шпионов sinon или шпионажа. например :
в b.js
export const fnB = () => 'hey there!';
в a.js
import { fbB } from 'b.js';
export const fnA = () => fbB();
в a.test.js
import { noCallThru } from 'proxyquire';
const proxyquireStrict = noCallThru();
const stubB = stub().returns('forced result');
const moduleA = proxyquireStrict('a.js', {
'b.js' : { fnB: stubB }
}).fnA;
console.log(fnA()); // 'forced result'