未调用模拟 Jest 回调方法

Mocked Jest callback method not called

我正在使用 jestjs

测试下面的 NodeJS function/module
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.

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

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