javascript 如何在每次测试中更改实现时模拟模块的构造函数方法的返回对象

yzuktlbb  于 2022-11-20  发布在  Java
关注(0)|答案(1)|浏览(103)

我如何在每次测试中模拟和更改构造函数的实现?
我正在查看lru-cache库,您可以将其命名为

const cache = new LRU({
  max: 500,
  ttl: 1000 * 60 * 15,
  updateAgeOnGet: false,
  updateAgeOnHas: false,
});

现在cache变量将有一个getset函数,我尝试在每个测试中只更改get实现。到目前为止,模拟整个模块并尝试在构造函数和/或get函数上调用mockImplementation,当测试调用我正在测试的函数时,没有反映出更改(它只有默认的模拟)
这是我尝试过的一件事

const LRU = require('lru-cache');
jest.mock('lru-cache');

在我的测试文件中

it('should blah blah', () => {
    LRU.mockImplementation(() => ({
      get: jest.fn().mockImplementation(data => ({
        response: data,
      })),
      set: jest.fn()
    }));

    // call function in a file that uses lru-cache
  });

我还尝试不直接模拟get函数来模拟构造函数,
然而,在我的所有尝试中,当我在代码中记录从构造函数返回的对象时,这是对模块的默认模拟,但get实现并不存在。
现在,如果我调用并在测试文件(而不是使用它的方法)中记录类似的内容,

cache.get.mockImplementation(identifier => ({
   response: identifier,
}));

它确实显示了变化。所以看起来mockImplementation不能坚持
任何帮助都将不胜感激,谢谢

zphenhs4

zphenhs41#

试着在测试之外像这样模拟它。如果不需要的话,你可以删除requireActual

jest.mock('lru-cache', () => {
  const lruCacheOriginal = jest.requireActual('lru-cache');
  return function () {
    return {
      ...lruCacheOriginal,
      get: jest.fn().mockImplementation(data => ({
        response: data,
      })),
    }
  }
});

it('should blah blah', () => {
  // call function in a file that uses lru-cache
});

您也可以检查您的Jest配置是否默认启用了模拟重置选项。或者只是在您的package.json中添加以下内容:

"jest": {
  "resetMocks": false
}

相关问题