Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点+;开玩笑+;模拟事件处理程序回调_Javascript_Node.js_Jestjs - Fatal编程技术网

Javascript 节点+;开玩笑+;模拟事件处理程序回调

Javascript 节点+;开玩笑+;模拟事件处理程序回调,javascript,node.js,jestjs,Javascript,Node.js,Jestjs,我试图测试Node.js代码中的一个函数,但我想模拟processStreamData: 异步函数测试(流){ //在这里对流运行一些检查 stream.on('data',异步(data)=>{ //在这里对数据进行一些检查 等待此消息。processStreamData(数据); }).on('finish',()=>{ //在这里做一些处理 解决(); }); } 异步processStreamData(数据){ ... } 这是我的测试: test('functiontotestsuc

我试图测试Node.js代码中的一个函数,但我想模拟
processStreamData

异步函数测试(流){
//在这里对流运行一些检查
stream.on('data',异步(data)=>{
//在这里对数据进行一些检查
等待此消息。processStreamData(数据);
}).on('finish',()=>{
//在这里做一些处理
解决();
});
}
异步processStreamData(数据){
...
}
这是我的测试:

test('functiontotestsuccess',异步(testCase)=>{
试一试{
让readStream=fs.createReadStream(`${DATA\u DIR}/genericsv.csv`);
spyOn(myClass,“processStreamData”).mockImplementation();
wait expect(myClass.functionToTest(readStream)).resolves.toEqual(未定义);
wait expect(myClass.processStreamData).toBeCalledWith(expect.anything());
testCase();
}捕获(例外){
console.log(异常);
失败(新错误(`testfailed${exception}`);
};
});
似乎是因为
processStreamData
在事件处理程序中,所以调用了原始函数(而不是模拟函数)

我还尝试通过

myClass.processStreamData=jest.fn.mockImplementation()
这没用。原始函数仍被调用


我在谷歌上搜索了一下,我很清楚jest在这方面有很多限制,但这是否仍然适用?如果没有,有人能帮我完成我应该如何设置我的模拟以便使用它的过程吗?

下面是一个单元测试解决方案:

index.ts

导出类SomeClass{
异步函数测试(流){
//在这里对流运行一些检查
流动
.on('data',异步数据=>{
//在这里对数据进行一些检查
等待此消息。processStreamData(数据);
})
.on('finish',()=>{
//在这里做一些处理
承诺。决心();
});
}
异步processStreamData(数据){
控制台日志(数据);
}
}
索引规范ts

从“fs”导入fs,{ReadStream};
从“路径”导入路径;
从“/”导入{SomeClass};
const myClass=new SomeClass();
常量数据_DIR='./.tmp';
之后(()=>{
开玩笑。恢复记忆();
});
测试('functionToTest success',异步()=>{
const readStream:readStream=fs.createReadStream(path.resolve(uu dirname,`${DATA_DIR}/genericsv.csv`));
常量事件:{[event:string]:(…args:any[])=>void}={};
jest.spyOn(readStream,'on').mockImplementation((事件:字符串,侦听器:(…参数:any[])=>void)=>{
事件[事件]=侦听器;
返回readStream;
});
spyOn(myClass,'processStreamData');
wait expect(myClass.functionToTest(readStream)).resolves.toEqual(未定义);
事件数据(“假数据”);
expect(myClass.processStreamData).toBeCalledWith('false data');
});
测试('FunctionToTestFinish',异步()=>{
const readStream:readStream=fs.createReadStream(path.resolve(uu dirname,`${DATA_DIR}/genericsv.csv`));
常量事件:{[event:string]:(…args:any[])=>void}={};
jest.spyOn(readStream,'on').mockImplementation((事件:字符串,侦听器:(…参数:any[])=>void)=>{
事件[事件]=侦听器;
返回readStream;
});
开玩笑的间谍(承诺,'决心');
wait expect(myClass.functionToTest(readStream)).resolves.toEqual(未定义);
events.finish();
期望(承诺。解决)。等待时间(1);
});
100%覆盖率的单元测试结果:

PASS src/stackoverflow/58244855/index.spec.ts(6.502s)
✓ 功能测试成功(14毫秒)
✓ 功能测试完成(1ms)
console.log src/stackoverflow/58244855/index.ts:3320
假数据
----------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
----------|----------|----------|----------|----------|-------------------|
所有文件| 100 | 100 | 100 | 100 ||
index.ts | 100 | 100 | 100 | 100 ||
----------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:2次通过,共2次
快照:共0个
时间:7.544s

源代码:

我建议您避免使用类,因为它更难测试。myClass是您的类的实例还是类本身?你的进口产品是什么样子的