【问题标题】:Unit testing async function with callback带回调的单元测试异步函数
【发布时间】:2019-08-19 23:36:16
【问题描述】:

尝试使用 readFile 函数编写用于读取 json 文件的单元测试,但是我收到错误:超时 - 在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调。模拟 json 文件时我一定做错了。

功能:

function jsonReader(filePath, cb) {
  fs.readFile(filePath, (err, fileData) => {
    if (err) {
      return cb && cb(err);
    }
    try {
      const object = JSON.parse(fileData);
      return object;
    } catch (err) {
      return cb && cb(err);
    }
  });
}
module.exports = jsonReader;

然后是测试文件:

const jsonReader = require('.././ReadJson');
jest.mock('fs', () => {
  const MOCK_FILE_INFO = { 'test.json': JSON.stringify({ name: 'myname' }) };
  return {
    readFile: (fpath, opts) => {
      if (fpath in MOCK_FILE_INFO) {
        return MOCK_FILE_INFO[fpath];
      }
    }
  };
});


test('Test file', (done) => {
  function callback(data) {
    expect(data.name).toBe('myname');
    done();
  }

  jsonReader('test.json', callback);
});

我尝试更改超时,但如果我将其设置得更高,执行也会花费更长的时间,并且仍然会出现相同的错误。

【问题讨论】:

标签: javascript node.js jestjs


【解决方案1】:

您正在尝试同步使用您的功能?

jest.mock('fs', () => {
  const MOCK_FILE_INFO = { 'test.json': JSON.stringify({ name: 'myname' }) };
  return {
    readFile: (fpath, callback) => {
      if (fpath in MOCK_FILE_INFO) {
        callback(null, MOCK_FILE_INFO[fpath]);
      }
    }
  };
});
function jsonReader(filePath, cb) {
  fs.readFile(filePath, (err, fileData) => {
    if (err) {
      return cb && cb(err);
    }
    try {
      const object = JSON.parse(fileData);
      cb(object);
    } catch (err) {
      return cb && cb(err);
    }
  });
}
module.exports = jsonReader;

【讨论】:

  • 不,应该是异步的。
  • @DragoşNeagoe 确实应该。我提供了上面的异步解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2018-11-18
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
相关资源
最近更新 更多