我正在尝试学习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
答案 0 :(得分:1)
componentDidMount
在shallow()
期间被调用。
这意味着setCommentsFromLocalStorage
被调用,并且在最初的fetchAllComments
调用期间都调用filterComments
和shallow()
。
api
已被模拟,因此它记录了对fetchAllComments
和filterComments
的调用。
这一切一旦发生,便会为setCommentsFromLocalStorage
和componentDidMount
创建间谍。再次被调用(再次调用fetchAllComments
和filterComments
)。
setCommentsFromLocalStorage
的间谍然后正确地报告它被调用过一次(因为它仅在对componentDidMount
的 second 调用中存在)。
fetchAllComments
和filterComments
上的间谍然后正确地报告他们两次被称为 ,因为它们在两次呼叫期间都存在 }}。
修复测试的最简单方法是在调用componentDidMount
之前清除fetchAllComments
和filterComments
上的模拟:
componentDidMount
答案 1 :(得分:0)
分别使用beforeEach
和afterEach
进行模拟和模拟还原间谍。
这在Jest文档的Setup and Teardown部分中进行了解释。