Node.js createWriteStream(';error';)上的Jest单元测试

Node.js createWriteStream(';error';)上的Jest单元测试,node.js,typescript,unit-testing,jestjs,nestjs,Node.js,Typescript,Unit Testing,Jestjs,Nestjs,我正在使用Nestjs,并编写了下面的函数,该函数从post请求接收一个文件,并将其保存在项目中的一个文件夹中。 我的问题是我不确定如何在('error')分支上测试 功能到单元测试 saveFile({ createReadStream, filename }: FileUpload): Promise<boolean> { return new Promise(async (resolve, reject) => { createReadStream

我正在使用Nestjs,并编写了下面的函数,该函数从post请求接收一个文件,并将其保存在项目中的一个文件夹中。 我的问题是我不确定如何在('error')分支上测试

功能到单元测试

  saveFile({ createReadStream, filename }: FileUpload): Promise<boolean> {
    return new Promise(async (resolve, reject) => {
      createReadStream().pipe(
        createWriteStream(join(process.cwd(), `apps/mull-api/uploads/${filename}`))
          .on('finish', () => resolve(true))
          .on('error', () => {
            console.log(createReadStream);
            reject(false);
          })
      );
    });
  }
这就是我的模拟文件的样子。我试图提供一个名称为空的mockFile,但它出错了

export const mockFile: FileUpload = {
  filename: 'zoro',
  mimetype: 'image/jpeg',
  encoding: '7bit',
  createReadStream(): ReadStream {
    return fs.createReadStream(join(process.cwd(), `apps/mull-api/uploads/mock-upload/zoro`));
  },
};
单元测试解决方案:

index.ts

从“fs”导入{createWriteStream,ReadStream};
从“路径”导入{join};
导出接口文件上载{
文件名:字符串;
mimetype:字符串;
编码:字符串;
createReadStream():ReadStream;
}
导出类文件服务{
公共存储文件({createReadStream,filename}:FileUpload):承诺{
返回新承诺(异步(解析、拒绝)=>{
createReadStream().pipe(
createWriteStream(join(process.cwd(),`apps/mull-api/uploads/${filename}`)
.on('finish',()=>resolve(true))
.on('错误',()=>{
拒绝(假);
}),
);
});
}
}
index.test.ts

从“/”导入{FileService,FileUpload};
从“fs”导入{createWriteStream,WriteStream};
从'ts jest/utils'导入{mocked};
开玩笑的模仿(‘fs’);
描述('64485251',()=>{
毕竟(()=>{
jest.resetAllMocks();
开玩笑。clearAllMocks();
});
它('应该保存文件',异步()=>{
const mockReadStream={pipe:jest.fn()};
常量mockFile:FileUpload={
文件名:“zoro”,
mimetype:'image/jpeg',
编码:“7bit”,
createReadStream:jest.fn().mockReturnValueOnce(mockReadStream),
};
常量mockWriteStream={
on:jest.fn().mockImplementation(函数(this、event、handler){
如果(事件=='finish'){
handler();
}
归还这个;
}),
};
mocked(createWriteStream).mockReturnValueOnce((mockWriteStream为未知)为WriteStream);
const service=new FileService();
const actual=await service.saveFile(mockFile);
expect(mockFile.createReadStream).tobeCalledTime(1);
expect(mockReadStream.pipe).toBeCalledTimes(1);
expect(createWriteStream).toBeCalledWith(expect.stringContaining('apps/mullapi/uploads/zoro'));
expect(mockWriteStream.on).toBeCalledWith('finish',expect.any(Function));
expect(mockWriteStream.on).toBeCalledWith('error',expect.any(Function));
expect(实际).toBeTruthy();
});
它('保存文件失败时应处理错误',异步()=>{
const mockReadStream={pipe:jest.fn()};
常量mockFile:FileUpload={
文件名:“zoro”,
mimetype:'image/jpeg',
编码:“7bit”,
createReadStream:jest.fn().mockReturnValueOnce(mockReadStream),
};
常量mockWriteStream={
on:jest.fn().mockImplementation(函数(this、event、handler){
如果(事件=='error'){
handler();
}
归还这个;
}),
};
mocked(createWriteStream).mockReturnValueOnce((mockWriteStream为未知)为WriteStream);
const service=new FileService();
wait expect(service.saveFile(mockFile)).rejects.toEqual(false);
expect(mockFile.createReadStream).tobeCalledTime(1);
expect(mockReadStream.pipe).toBeCalledTimes(1);
expect(createWriteStream).toBeCalledWith(expect.stringContaining('apps/mullapi/uploads/zoro'));
expect(mockWriteStream.on).toBeCalledWith('finish',expect.any(Function));
expect(mockWriteStream.on).toBeCalledWith('error',expect.any(Function));
});
});
单元测试结果:

 PASS  src/stackoverflow/64485251/index.test.ts (10.201s)
  64485251
    ✓ should save file (6ms)
    ✓ should handle error if save file failed (3ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.ts |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        11.344s

您是在寻找单元测试还是集成测试?为什么在promise中使用异步函数?@slideshowp2我正在尝试对该函数进行单元测试。我需要在我的产品中达到80%的覆盖率project@SyedMisharNewaz我是按照一个指南做的,那就是在那里做的
 PASS  src/stackoverflow/64485251/index.test.ts (10.201s)
  64485251
    ✓ should save file (6ms)
    ✓ should handle error if save file failed (3ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.ts |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        11.344s