首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用的模拟Jest回调方法

未调用的模拟Jest回调方法
EN

Stack Overflow用户
提问于 2020-12-18 17:44:23
回答 1查看 957关注 0票数 2

我正在使用jestjs测试下面的NodeJS函数/模块

代码语言:javascript
复制
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,
};

第一项测试是:

代码语言:javascript
复制
  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函数,为什么不调用

代码语言:javascript
复制
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,我还尝试添加以下内容,但没有成功:

代码语言:javascript
复制
const mock = require("mock-fs");
const fs = require("fs");
jest.mock("fs");
  beforeEach(() => {
    mock({
      test: "1",
    });
  });

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-19 03:03:58

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

例如。

callback.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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();
  });
});

单元测试结果:

代码语言:javascript
复制
 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65361608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档