Javascript Sinon、递归和设置超时

Javascript Sinon、递归和设置超时,javascript,recursion,settimeout,sinon,Javascript,Recursion,Settimeout,Sinon,我在stackoverflow中查找了这个问题,但似乎大多数问题涵盖了三个问题中的两个,而且大多数人不需要全部使用这三个问题 这是代码片段。我试图让testA在某个超时后递归调用自己 const testA=async()=>{ 设置超时(()=>{ 种皮(); }, 1000); 返回; }; 以下是我的测试代码: //test.js const someThing=require(“../tester.js”); const chai=要求(“chai”); const sinonChai

我在stackoverflow中查找了这个问题,但似乎大多数问题涵盖了三个问题中的两个,而且大多数人不需要全部使用这三个问题

这是代码片段。我试图让
testA
在某个超时后递归调用自己

const testA=async()=>{
设置超时(()=>{
种皮();
}, 1000);
返回;
};
以下是我的测试代码:

//test.js
const someThing=require(“../tester.js”);
const chai=要求(“chai”);
const sinonChai=要求(“sinon chai”);
const sinon=要求(“sinon”);
柴.用(新竹);
描述(“测试A”,()=>{
它(“应该打两次电话,()=>{
常数时钟=sinon.useFakeTimers();
const testASpy=sinon.spy(某物,“testA”);
testASpy();
chai.expect(testASpy).to.have.been.calledOnce;//可以
时钟滴答(1000);
chai.expect(testASpy).to.have.been.calledTwice;//失败
});
});

我一直看到每个人都在说“Sinon不能存根一个独立的函数”,但我不知道为什么。如果有人能给我指出阅读更多关于它的方向,我真的很想看到这一点。同时,如果有人知道如何让这项工作顺利进行,我也想知道更多。再次感谢

您的代码没有意义。它将导致无限循环。以下是单元测试解决方案:

index.ts

export const testA=async()=>{
设置超时(()=>{
控制台计数(“测试”);
种皮();
}, 1000);
};
索引规范ts

import*作为mod from./;
从“sinon”进口sinon;
从“chai”导入{expect};
描述(“58843454”,()=>{
它(“应该通过”,异步()=>{
常数时钟=sinon.useFakeTimers();
const testASpy=sinon.spy(mod,“testA”);
等待测试();
expect(testASpy.calledOnce).to.be.true;
时钟滴答(1000);
expect(testASpy.calledTwice).to.be.true;
});
});
100%覆盖率的单元测试结果:

58843454
种皮:1
✓ 应该通过
1次通过(16毫秒)
---------------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
---------------|----------|----------|----------|----------|-------------------|
所有文件| 100 | 100 | 100 | 100 ||
索引规范ts | 100 | 100 | 100 | 100 ||
index.ts | 100 | 100 | 100 | 100 ||
---------------|----------|----------|----------|----------|-------------------|

源代码:

看到一个
async
函数不
await
,我的眼睛很痛。真实的testA确实包含一个在settimeout中使用await的函数,为了简单起见,我试着编辑掉了它的一部分。我为这一混乱道歉!