gpt4 book ai didi

node.js - 如何用 Jest 模拟 `fs.promises.writeFile`

转载 作者:行者123 更新时间:2023-12-03 12:17:46 26 4
gpt4 key购买 nike

我试图模拟 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()"并创建了文件。
依赖版本
  • 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在导入时被解构,而不是一直被称为 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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com