我有下面的文件,我试图编写单元测试:
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
模拟..任何想法?
2条答案
按热度按时间laik7k3q1#
赋值后尝试使用
.mockReturnValue()
我遇到了同样的行为,并在赋值后调用
mockFn.mockReturnValue(value)
成功。举例来说:
字符串
我在jest文档中看到了这两种模式。
mockFn.mockReturnValue(value)
,其中显示了分配后调用。jest.requireActual(moduleName)
,其中显示了分配期间的调用。我想知道后一种情况是否需要在模拟的返回值上Assert其他交互模式,但我还没有弄清楚,我似乎无法使用
spyOn
模式suggested in another answer here复制成功。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
配置中:字符串
1.在
beforeEach
函数中定义mock