用玩笑+酶测试,模拟函数无​​缘无故被调用两次

时间:2019-02-14 01:24:19

标签: javascript reactjs jestjs enzyme

我正在尝试学习Jest和酶,但是遇到一个我找不到解决方案的问题,这是我的测试。我知道不是很好,但是我正在学习:

\1

问题是import * as apiMock from '../api'; const fakePostId = '1'; const fakePersona = 'Fake'; jest.mock('../api', () => { return { fetchAllComments: jest.fn(() => { return []; }), filterComments: jest.fn(() => { return []; }), createCommentObject: jest.fn(() => { return []; }), }; }); test('checks if functions are called after didMount', () => { const component = shallow( <Comments postId={fakePostId} currentPersona={fakePersona} /> ); const spySetComments = jest.spyOn( component.instance(), 'setCommentsFromLocalStorage' ); component.instance().componentDidMount(); expect(spySetComments).toHaveBeenCalledTimes(1); //Don't know why these are called 2! times, I can't see why removing componentDidMount makes it 0. expect(apiMock.fetchAllComments).toHaveBeenCalledTimes(1); expect(apiMock.filterComments).toHaveBeenCalledTimes(1); } 失败,原因如下:

  

预期模拟函数已被调用一次,但是被调用   两次。

但是我不知道为什么。 toHaveBeenCalledTimes(1)仅运行一次,因此该功能必须从componentDidMount运行并执行一次这些api调用。

setCommentsFromLocalStorage

2 个答案:

答案 0 :(得分:1)

componentDidMountshallow()期间被调用。


这意味着setCommentsFromLocalStorage被调用,并且在最初的fetchAllComments调用期间都调用filterCommentsshallow()

api已被模拟,因此它记录了对fetchAllCommentsfilterComments的调用。


这一切一旦发生,便会为setCommentsFromLocalStoragecomponentDidMount创建间谍。再次被调用(再次调用fetchAllCommentsfilterComments )。

setCommentsFromLocalStorage的间谍然后正确地报告它被调用过一次(因为它仅在对componentDidMount second 调用中存在)。

fetchAllCommentsfilterComments上的间谍然后正确地报告他们两次被称为 ,因为它们在两次呼叫期间都存在 }}。


修复测试的最简单方法是在调用componentDidMount之前清除fetchAllCommentsfilterComments上的模拟:

componentDidMount

答案 1 :(得分:0)

分别使用beforeEachafterEach进行模拟和模拟还原间谍。

这在Jest文档的Setup and Teardown部分中进行了解释。