如何解决如何测试 javascript 无限递归工作函数场景
我正在尝试在类中测试以下“worker”方法但没有成功,因为它是“无限循环”/递归:
Class TheClassYaDaYaDa {
constructor(var1) {
(...)
}
async worker() {
return new Promise(async (resolve,reject) => {
try {
await this.doStuff();
return resolve();
} catch (err) {
return reject(err);
} finally {
this.worker();
}
});
}
}
这是我正在构建的测试:
it('It should not throw error',async function () {
let error = false;
const var1 = 'parameterTest';
stub1 = sinon.stub(TheClassYaDaYaDa.prototype,'doStuff').resolves();
// if I use the following stub logically the test will not succeed. If I don't I get an infinte loop
// stub2 = sinon.stub(TheClassYaDaYaDa.prototype,'worker').resolves();
let classtoTest;
try {
classtoTest = new TheClassYaDaYaDa(limitedInstance);
result = await classtoTest.worker();
} catch (err) {
error = err;
}
expect(error).to.be.false;
sinon.assert.calledOnce(stub1);
//also assert that the finally statement run at least once!
});
有没有办法测试这个场景?
解决方法
我会从不同的角度来解决这个问题,递归总是很棘手,但流行的设计之一是将调度和运行逻辑一分为二。
考虑以下事项:
async worker() {
await this.scheduleWorker();
}
private scheduleWorker() {
// return new Promise ...
}
现在可以测试 scheduleWorker 函数是否调用了 worker,以及 worker 调用了 scheduleWorker(如果可以访问私有方法)。
如果没有,您可以模拟 worker 方法以仅在第一次调用时返回 worker 逻辑,并在后续调用中返回 noops。这也适用于您当前的设计,允许您断言递归调用已正确触发。
我对 sinon 不太了解,但你想要类似的东西:
var originalWorker = classToTest.originalWorker;
classToTest.originalWorker = function() {
originalWorker();
classToTest.originalWorker = function() { }
}
大多数模拟框架都有类似的控件来多次启用模拟方法(用于后续调用)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。