我正在使用fs. fullReadStream读取文件。当从文件中执行函数时,它正在工作,触发事件(data,end)。我需要编写一些单元测试,但当调用函数时。它没有命中任何事件(data,end)。我不明白原因。
我正在处理的原始问题是从响应中下载文件。为了隔离,我创建了file_func.ts文件。
const response = await fetch(fileUrl);
if (!response.ok) {
throw new Error(response.statusText);
}
const dest = fs.createWriteStream(filePath);
response.body.pipe(dest);
response.body.on("finish", async function () {
});
字符串
环境节点v18.16.0
Typescript:版本4.9.5(用作节点模块)
file_func.ts
import * as fs from 'fs';
import path from "path";
const fileName = "./tests/sample.txt";
const dirPath = path.join(__dirname, fileName);
export async function working() {
var data = '';
var readerStream = fs.createReadStream(dirPath); //Create a readable stream
readerStream.setEncoding('utf8'); // Set the encoding to be utf8.
// Handle stream events --> data, end, and error
readerStream.on('data', function(chunk) {
console.log('data');
data += chunk;
});
readerStream.on('end',function() {
console.log('end');
console.log(data);
});
readerStream.on('error', function(err) {
console.log(err.stack);
});
console.log("Program Ended");
}
working();
型
测试结果:
t@GTKNZ072:~/Project/pl/functions/a$ ts-node file_func.ts
Program Ended
data
end
This is a test file
Another line
型
单元测试文件
import {working} from "../file_func";
it("Test read files", async () => {
await working();
});
型
单元测试结果
console.log
Program Ended
at working (functions/a/file_func.ts:28:11)
console.log
Program Ended
at working (functions/a/file_func.ts:28:11)
型
1条答案
按热度按时间5q4ezhmt1#
你的代码有几个问题。
1.因为你是在你的模块内部调用
working();
,所以working
函数将在测试期间被调用两次:第一次是在导入模块时(由于前面提到的working()
调用),第二次是在你的测试await working();
中。这就是你看到Program Ended
日志两次的原因。1.仅仅因为你做了
working
xrc并不意味着它会像你期望的那样工作。Node仍然会等待所有的流操作完成,所以你的代码在理论上应该工作,但这将发生在Program Ended
执行之后。这是我在运行tsx
并使用NodeJS Test runner时得到的结果:字符串
相反,您需要在streamer代码周围添加一个
Promise
,如下所示:型
这将使
await working();
执行其预期操作并打印型
console.log('data')
和console.log('end')
。*