我可以从我正在测试的函数中截取一个深度为三级的函数吗



我有这个场景,我正在尝试为它编写unitTest

const processAllItems = (listOfItems) => {
//some processing and then
let itemListProcessed = [];
let itemProcessed;
listOfItems.forEach(item => {
itemProcessed = processItem(item)
itemListProcessed.push(itemProcessed);
})
return itemListProcessed;
}

const processItem = (item) => {
//Do some processing and then
let validItem = isItemValid(item);
if(validItem) {
// do some processing
} 
else {
//do something else
}
}

const isItemValid = (item) => {
if(item)  return true
else  return false
}
}

我正在为它编写单元测试。我想测试高级方法(processAllItems(((。在这个方法内部调用processItem((,在processItem(((方法内部是另一个方法isItemValid((。如何在不截断processItem((方法的情况下截断isValidItem((,使其始终返回true。我试过了,但没用:

sandbox.stub(mainService, 'isItemValid').callsFake(() => {
console.log("stub is triggered")
return true;
});

提前感谢您,如有任何帮助将不胜感激。我正在使用摩卡/西农

我的代码是这样的:

// Inside this file are all three methods described on the post
const mainService = require('pathToFile'); 
describe.only('Check processAllItems', async function() {
let sandbox;
before(async function() {
sandbox = sinon.createSandbox();
})
after(async function () {
sandbox.restore();
})
it.only('should process sale', async function() {
sandbox.stub(mainService, 'isValidItem').callsFake(() => {
return false;
});
let resutls = await mainService.processAllItems(record);
})   
})

我使用重新布线包模块来存根isItemValid函数。例如

index.js:

const processAllItems = (listOfItems) => {
let itemListProcessed = [];
let itemProcessed;
listOfItems.forEach((item) => {
itemProcessed = processItem(item);
itemListProcessed.push(itemProcessed);
});
return itemListProcessed;
};
const processItem = (item) => {
let validItem = isItemValid(item);
if (validItem) {
} else {
}
return validItem;
};
const isItemValid = (item) => {
if (item) return true;
return false;
};
module.exports = { processAllItems };

index.test.js:

const rewire = require('rewire');
const sinon = require('sinon');
const { expect } = require('chai');
describe('Check processAllItems', () => {
it('should pass', () => {
const mod = rewire('./');
const isItemValidStub = sinon.stub().returns(true);
mod.__set__('isItemValid', isItemValidStub);
const listOfItems = [0, 1];
const actual = mod.processAllItems(listOfItems);
expect(actual).to.be.eql([true, true]);
sinon.assert.calledWithExactly(isItemValidStub.firstCall, 0);
sinon.assert.calledWithExactly(isItemValidStub.secondCall, 1);
});
});

带覆盖率报告的单元测试结果:

Check processAllItems
✓ should pass (696ms)

1 passing (704ms)
----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |      80 |       25 |      75 |   85.71 |                   
index.js |      80 |       25 |      75 |   85.71 | 20,21             
----------|---------|----------|---------|---------|-------------------

源代码:https://github.com/mrdulin/expressjs-research/tree/master/src/stackoverflow/60857745

最新更新