我在模块作用域的模块中有两个功能。其中一个功能被另一个使用。
async function allCinemas({ puppeteer, states }) {
const cinemaDetails = [];
const page = await puppeteer
.launch({
handleSIGINT: true /*devtools: false,headless: true*/
})
.then(browser => browser.newPage());
await page.setViewport({ width: 1366, height: 735 }); //form factor - laptop/PC
await page.goto("https://www.somesite.come");
for (const state of states) {
const res = await cinemasfromState(page, state);
res.forEach(cin => {
cinemaDetails.push(cin);
});
}
await page.close();
return cinemaDetails;
}
async function cinemasfromState(page, state) {
const CINEMA_SELECTOR = `div[$[STATE]] div.top-select-option h.element`;
let res = await page.evaluate(
(elementPath, state) => {
let results = Array.from(document.querySelectorAll(elementPath)).map(
function(cin, index) {
let result = {
cinemaState: this.state,
cinemaId: cin.getAttribute("id"),
cinemaName: cin.getAttribute("name"),
};
return result;
},
{ state }
);
return [...results.reduce((a, c) => a.set(c.cinemaId, c), new Map()).values()];
},
CINEMA_SELECTOR.replace("$[STATE]", state),
state
);
return Promise.resolve(res);
}
export { allCinemas, cinemasfromState };
我已经分别测试过function cinemasfromState
因此,当我测试function allCinemas
时,我正在考虑存根function cinemasfromState
。
我如何不存根/模拟cinemasfromState
以便不必重复测试?
答案 0 :(得分:1)
使用sinon
在测试b
时,您应该根据a
的不同响应(高兴和失败流)来测试其行为。因此,您需要将a
存入不同的收益中以正确测试b
。
import * as allMethods from './whereever-the-file-is';
import sinon from 'sinon';
// inside your test case
const aStub = sinon.stub(allMethods, 'a');
aStub.returns('x');
// test your function b on what it should do when a returns 'x'
aStub.returns('y');
// test your function b on what it should do when a returns 'y'
我尚未测试此代码,因此如果您需要更多有关sinon存根的信息,请参考official docs。
答案 1 :(得分:0)
只要两个函数都在同一个模块中定义,就没有一种明智的方式来模拟仅一个函数,然后另一个函数使用该模块。也许很清楚为什么要考虑执行代码的顺序。
A
和B
。函数B
引用了函数A
。 A
内部删除对B
的引用。因此,要模拟这两个功能的唯一方法就是将它们放在不同的模块中,因为您可以在测试中轻松模拟其中的一个。导出它们时,将它们放在不同的模块中应该很容易。