我试图使用Jest来模拟fs.writeFile
的promise
版本,并且模拟的函数没有被调用。
待测试的函数(createFile.js
):
const { writeFile } = require("fs").promises;
const createNewFile = async () => {
await writeFile(`${__dirname}/newFile.txt`, "Test content");
};
module.exports = {
createNewFile,
};
Jest测试 (createFile.test.js
):
const fs = require("fs").promises;
const { createNewFile } = require("./createFile.js");
it("Calls writeFile", async () => {
const writeFileSpy = jest.spyOn(fs, "writeFile");
await createNewFile();
expect(writeFileSpy).toHaveBeenCalledTimes(1);
writeFileSpy.mockClear();
});
我知道writeFile
实际上被调用了,因为我运行了node -e "require(\"./createFile.js\").createNewFile()"
,并且文件已经创建。
依赖版本
- Node.js: 14.1.0
- Jest: 26.6.3
-- 这是对createFile.test.js
文件的另一次尝试 --
const fs = require("fs");
const { createNewFile } = require("./createFile.js");
it("Calls writeFile", async () => {
const writeFileMock = jest.fn();
jest.mock("fs", () => ({
promises: {
writeFile: writeFileMock,
},
}));
await createNewFile();
expect(writeFileMock).toHaveBeenCalledTimes(1);
});
这会抛出以下错误:
ReferenceError: /Users/danlevy/Desktop/test/src/createFile.test.js: The module factory of `jest.mock()` is not allowed to reference any out-of-scope variables.
Invalid variable access: writeFileMock
writeFile
的模拟版本,以便我可以调用类似于toHaveBeenCalled(..)
的模拟函数?我尝试将writeFile
简单地设置为jest.mock(..)
之外的变量,但是我会收到以下错误:jest.mock()的模块工厂不允许引用任何超出范围的变量
,其中超出范围的变量是jest.mock(..)
之外的变量。请参见我的原始问题中的尝试。 - Dan Levylet mockWriteFile = jest.fn()...
但风险自负,请参见此处的解释https://jestjs.io/docs/en/es6-class-mocks#calling-jestmockdocsenjest-objectjestmockmodulename-factory-options-with-the-module-factory-parameter。应该在测试文件中导入`fs`,这样就可以访问`fs.promises.writeFile`进行断言。 - Estus Flaskfs
,但仍然出现了相同的错误。请参见 OP 中更新的代码。 - Dan Levymock-fs
等其他工具,例如简单地检查是否调用了writeFile
)? - Dan Levyfs
的目的是为了在测试范围内引用它,而不是 writeFileSpy 变量,因为这样可以有效地使writeFileSpy === fs.promises.writeFile
。我已经更新了帖子以提高清晰度。 - Estus Flask