单元测试fs额外的writeFile



我使用了fs-extra中的writeFile来生成我的文件当我尝试使用JEST进行单元测试时,我总是会遇到一个错误,比如writeFile方法即使被调用了也没有被调用。有人能给我建议一下正确测试的方法吗。

这些是我正在使用的函数。注意:没有使用任何类,我们将其作为方法使用

import { writeFile } from 'fs-extra';
import { resolve as pathResolve } from 'path';
export default async function generateFile(): Promise<void>{
await writeSampleFile(value);
// other stuffs
}
async function writeSampleFile(value: string): Promise<void> {
try {
await writeFile(pathResolve(path), value, 'utf8');
} catch (err) {
}
}

spec.ts:

import generateFile from './x';
import * as fsExtra from 'fs-extra';
const writeFileSpy = jest.spyOn(fsExtra, 'writeFile');

describe('writeFile', async () => {
test('it should check whether writeFile has been called', async () => {
await generateFile();
//Since internally it was calling writeFile i was checking for writeSampleFile as well
expect(writeFileSpy).toHaveBeenCalled();
});
});

虽然我已经调用了所有的东西,但我没有得到调用的方法,测试也失败了,但我的文件是使用writeFile生成的。

不能将async/await语法与describe一起使用。否则,它将抛出错误:

从";描述";不支持。测试必须同步定义。

从"0"返回一个值;描述";将无法通过未来版本的Jest的测试。

如果使用import * as fsExtra from 'fs-extra'

确保allowSyntheticDefaultImportsesModuleInterop配置的值在tsconfig.json中为false

如果使用import fsExtra from 'fs-extra',则应确保这两种配置的值在tsconfig.json中为true

{
"compilerOptions": {
"allowSyntheticDefaultImports": true,
"esModuleInterop": true
}
}

例如

index.ts:

import { writeFile } from 'fs-extra';
import { resolve as pathResolve } from 'path';
export default async function generateFile(value): Promise<void> {
await writeSampleFile(value);
}
async function writeSampleFile(value: string): Promise<void> {
try {
await writeFile(pathResolve('some path'), value, 'utf8');
} catch (err) {}
}

index.spec.ts:

import generateFile from './';
import fsExtra from 'fs-extra';
const writeFileSpy = jest.spyOn(fsExtra, 'writeFile');
describe('writeFile', () => {
test('it should check whether writeFile has been called', async () => {
await generateFile('jest');
expect(writeFileSpy).toHaveBeenCalled();
});
});

单元测试结果:

PASS  src/stackoverflow/58625148/index.spec.ts
writeFile
✓ it should check whether writeFile has been called (28ms)
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.513s, estimated 9s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58625148

最新更新