作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图模拟 promise
fs.writeFile
的版本使用 Jest,并且没有调用模拟函数。
要测试的功能(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()"
并创建了文件。
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
在导入时被解构,而不是一直被称为 fs.promises.writeFile
方法,它不受 spyOn
的影响.
它应该像任何其他模块一样被 mock :
jest.mock("fs", () => ({
promises: {
writeFile: jest.fn().mockResolvedValue(),
readFile: jest.fn().mockResolvedValue(),
},
}));
const fs = require("fs");
...
await createNewFile();
expect(fs.promises.writeFile).toHaveBeenCalledTimes(1);
模拟
fs
是有意义的几乎没有因为 unmocked 函数会产生副作用并可能对测试环境产生负面影响。
关于node.js - 如何用 Jest 模拟 `fs.promises.writeFile`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64947786/
我是一名优秀的程序员,十分优秀!