我有这个场景,我正在尝试为它编写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