fn -使用jest.mock时返回值返回undefined

xxslljrj  于 6个月前  发布在  Jest
关注(0)|答案(2)|浏览(96)

我有下面的文件,我试图编写单元测试:

import { document } from '../../globals';
const Overlay = () => {
  console.log(document.getElementsByTagName()); // this outputs 'undefined'
};

字符串
我正在努力模拟getElementsByTagName函数。我的测试如下所示。

import { document } from '../../globals';
jest.mock('../../globals', () => ({
  document: {
    getElementsByTagName: jest.fn().mockReturnValue('foo')
  }
}));
console.log(document.getElementsByTagName()); // this outputs 'foo'


但不幸的是,顶部文件中的console.log总是输出undefined。它可以看到文档对象和getElementsByTagName mock,但返回值总是undefined
如果我console.log(document.getElementsByTagName),我得到以下结果:

{ getElementsByTagName:
   { [Function: mockConstructor]
     _isMockFunction: true,
     getMockImplementation: [Function],
     mock: [Getter/Setter],
     mockClear: [Function],
     mockReset: [Function],
     mockReturnValueOnce: [Function],
     mockReturnValue: [Function],
     mockImplementationOnce: [Function],
     mockImplementation: [Function],
     mockReturnThis: [Function],
     mockRestore: [Function] },
}


但是如果我在另一个文件中做同样的事情,我会得到这个:

function () {
  return fn.apply(this, arguments);
}


我的怀疑是,jest.mock是 Package 在另一个函数jest.fn模拟..任何想法?

laik7k3q

laik7k3q1#

赋值后尝试使用.mockReturnValue()

我遇到了同样的行为,并在赋值后调用mockFn.mockReturnValue(value)成功。
举例来说:

import { document } from '../../globals.js'

jest.mock('../../globals.js', () => ({
  document: {
    getElementsByTagName: jest.fn()
  }
}))

document.getElementsByTagName.mockReturnValue('foo')

console.log(document.getElementsByTagName()); // this outputs 'foo'

字符串
我在jest文档中看到了这两种模式。

  • 参见:mockFn.mockReturnValue(value),其中显示了分配后调用。
  • 参见:jest.requireActual(moduleName),其中显示了分配期间的调用。

我想知道后一种情况是否需要在模拟的返回值上Assert其他交互模式,但我还没有弄清楚,我似乎无法使用spyOn模式suggested in another answer here复制成功。

ymzxtsji

ymzxtsji2#

在我的例子中,我使用react-scripts来运行测试(在我的package.json中,test属性被设置为react-scripts test)。
幸运的是,我偶然发现了这个Stack Overflow answer,我发现react-scripts默认将jest.resetMocks设置为true。在标准的jest配置中,这是false
这意味着当运行react-scripts test时,在每次测试运行之前,您的mock实现将完全重置,并且您的mock函数将返回undefined
有几种方法可以解决这个问题:
1.在package.json中,将resetMocks: false添加到jest配置中:

"jest": {
  ...,
  "resetMocks": false
}

字符串
1.在beforeEach函数中定义mock

相关问题