node.js - 未调用模拟 Jest 回调方法

标签 node.js callback jestjs

我正在使用 jestjs 测试下面的 NodeJS 功能/模块

const fs = require("fs");
const path = require("path");
function read(filename, callback) {
  fs.readFile(path.join(__dirname, filename), { encoding: "utf-8" }, callback);
}

module.exports = {
  read,
};

第一个测试是:

  test("callback data returned is correct", (done) => {
    function callback(err, data) {
      try {
        expect(data).toBe("1");
        done();
      } catch (err) {
        done(err);
      }
    }
    read("./test", callback);
  });

并且成功(我有一个实际的test文件,其内容为1

第二个有点棘手。由于我提供了一个mockCallback函数来read为什么不调用回调?

const { read } = require("./callback");

describe("callback testing", () => {
  test("callback is called", (done) => {
    const mockCallback = jest.fn((err, data) => data);
    read("./test", mockCallback);
    expect(mockCallback).toHaveBeenCalled();
    done();
  });
});

测试失败,在检查模拟函数时似乎没有调用它。

我还尝试添加以下内容来模拟 fs.readFile,但没有取得太大成功:

const mock = require("mock-fs");
const fs = require("fs");
jest.mock("fs");
  beforeEach(() => {
    mock({
      test: "1",
    });
  });

我想要一个模拟最少依赖方法的解决方案,并解释为什么回调不运行。

最佳答案

您应该模拟 fs.readFile 方法并在测试用例中触发回调。

例如

callback.js:

const fs = require('fs');
const path = require('path');

function read(filename, callback) {
  fs.readFile(path.join(__dirname, filename), { encoding: 'utf-8' }, callback);
}

module.exports = {
  read,
};

callback.test.js:

const { read } = require('./callback');
const fs = require('fs');

describe('callback testing', () => {
  test('callback is called', () => {
    const mockCallback = jest.fn();
    const mockData = 'mock file data';
    const mockReadFile = jest.spyOn(fs, 'readFile').mockImplementationOnce((filename, options, callback) => {
      callback(null, mockData);
    });
    read('./test', mockCallback);
    expect(mockCallback).toHaveBeenCalled();
    expect(mockReadFile).toBeCalledWith(expect.any(String), { encoding: 'utf-8' }, mockCallback);
    mockReadFile.mockRestore();
  });
});

单元测试结果:

 PASS  examples/65361608/callback.test.js
  callback testing
    ✓ callback is called (3 ms)

-------------|---------|----------|---------|---------|-------------------
File         | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------|---------|----------|---------|---------|-------------------
All files    |     100 |      100 |     100 |     100 |                   
 callback.js |     100 |      100 |     100 |     100 |                   
-------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        4.992 s, estimated 5 s

关于node.js - 未调用模拟 Jest 回调方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65361608/

相关文章:

node.js - 如何将 Node docker 容器与 postgres docker 容器连接

c - 在c中实现定时器回调

javascript - Jest 无法从 npm 链接模块转换导入

javascript - Node JS request.post 在 AWS Lambda 中未触发

jquery - digital ocean 服务器上的 apache2/nodejs/express - 如何在没有地址使用错误的情况下监听公共(public)端口(80)

javascript - 循环函数(Javascript 回调帮助)

javascript - Node.js 和同步 API 函数

angular-testing-library:getByRole 查询仅适用于 hidden: true 选项

unit-testing - Jest 绿色复选标记未显示在终端上

javascript - 使用 NodeJS 将卡添加到 Stripe 客户