createWriteStream 的 Jest 单元测试('error')

Pol*_*uge 7 unit-testing node.js typescript jestjs nestjs

我正在使用 Nestjs 并编写了下面的函数,该函数从发布请求接收文件并将其保存在我的项目中的文件夹中。我的问题是我不确定如何测试on('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);
          })
      );
    });
  }
Run Code Online (Sandbox Code Playgroud)

我如何测试on('finish')分支

  it('should save file', async () => {
    const returnedFile = await service.saveFile(mockFile);
    expect(returnedFile).toBe(true);
  });
Run Code Online (Sandbox Code Playgroud)

这就是我的模拟文件的样子。我尝试提供一个名称为空的模拟文件,但它出错了。

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`));
  },
};
Run Code Online (Sandbox Code Playgroud)

sli*_*wp2 2

我们可以模拟createWriteStream,.on(\'finish\').on(\'error\')使用mockImplementation(). 并在mock实现函数中自行触发这两个事件。

\n

模拟实现函数中的\'finish\'事件是;模拟实现函数中的事件是handler() => resolve(true)\'error\'handler() => reject(false);

\n

查看模拟实现和下面的示例:

\n
const myMockFn = jest.fn(cb => cb(null, true));\n\nmyMockFn((err, val) => console.log(val));\n// > true\n
Run Code Online (Sandbox Code Playgroud)\n

index.ts:

\n
const myMockFn = jest.fn(cb => cb(null, true));\n\nmyMockFn((err, val) => console.log(val));\n// > true\n
Run Code Online (Sandbox Code Playgroud)\n

index.test.ts:

\n
import { createWriteStream, ReadStream } from \'fs\';\nimport { join } from \'path\';\n\nexport interface FileUpload {\n  filename: string;\n  mimetype: string;\n  encoding: string;\n  createReadStream(): ReadStream;\n}\n\nexport class FileService {\n  public saveFile({ createReadStream, filename }: FileUpload): Promise<boolean> {\n    return new Promise(async (resolve, reject) => {\n      createReadStream().pipe(\n        createWriteStream(join(process.cwd(), `apps/mull-api/uploads/${filename}`))\n          .on(\'finish\', () => resolve(true))\n          .on(\'error\', () => {\n            reject(false);\n          }),\n      );\n    });\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

单元测试结果:

\n
 PASS  src/stackoverflow/64485251/index.test.ts (10.201s)\n  64485251\n    \xe2\x9c\x93 should save file (6ms)\n    \xe2\x9c\x93 should handle error if save file failed (3ms)\n\n----------|----------|----------|----------|----------|-------------------|\nFile      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |\n----------|----------|----------|----------|----------|-------------------|\nAll files |      100 |      100 |      100 |      100 |                   |\n index.ts |      100 |      100 |      100 |      100 |                   |\n----------|----------|----------|----------|----------|-------------------|\nTest Suites: 1 passed, 1 total\nTests:       2 passed, 2 total\nSnapshots:   0 total\nTime:        11.344s\n
Run Code Online (Sandbox Code Playgroud)\n