在同一测试中多次模拟返回值(不同的值)?

时间:2019-12-19 21:40:10

标签: node.js jestjs

我建立了一个使用node-glob搜索文件的模块。

fileCollector.js

const glob = require('glob');

exports.getFiles = (directory) => {
  return {
    freeMarker: glob.sync(directory + '/**/*.ftl'),
    sass: glob.sync(directory + '/**/*.scss')
  };
};

我正在尝试编写测试,以便验证以下内容—选中标记指示已完成。

  1. ✅用正确的参数两次调用了Glob
  2. getFiles的返回值正确

fileCollector.test.js

const glob = require('glob');
const fileCollector = require('fileCollector');

jest.mock('glob');

describe('getFiles', () => {
  it('should get files', () => {
    const files = fileCollector.getFiles('/path/to/files');

    expect(glob.sync.mock.calls).toEqual([['/path/to/files/**/*.ftl'], ['/path/to/files/**/*.scss']]);
    expect(files).toEqual({
      freeMarker: 'INSERT_MOCKED_VALUE_FROM_GLOB',
      sass: 'INSERT_MOCKED_VALUE_FROM_GLOB'
    });
  });
});

如何使用两个单独的返回值模拟两次glob的返回值,以便可以测试getFiles的返回值?


注意: Jest mock module multiple times with different values不能回答我的问题,因为它在单独的测试中一次模拟了另一个值。

1 个答案:

答案 0 :(得分:0)

两次使用mockReturnValueOnce函数。例如:

glob.sync
  .mockReturnValueOnce(['path/to/file.ftl'])
  .mockReturnValueOnce(['path/to/file.sass']);

完整示例:

fileCollector.test.js

const glob = require('glob');
const fileCollector = require('fileCollector');

jest.mock('glob');

describe('getFiles', () => {
  it('should get files', () => {
    glob.sync
      .mockReturnValueOnce(['path/to/file.ftl'])
      .mockReturnValueOnce(['path/to/file.sass']);

    const files = fileCollector.getFiles('/path/to/files');

    expect(glob.sync.mock.calls).toEqual([['/path/to/files/**/*.ftl'], ['/path/to/files/**/*.scss']]);
    expect(files).toEqual({
      freeMarker: ['path/to/file.ftl'],
      sass: ['path/to/file.sass']
    });
  });
});

来源: Jest - Mock Return Values