Javascript 使用jest和x2B进行测试;例如,mock函数被调用两次是没有原因的
我正在努力学习笑话和酶,但我遇到了一个无法解决的问题,这是我的测试。。这不是很好,我知道,但我正在学习:Javascript 使用jest和x2B进行测试;例如,mock函数被调用两次是没有原因的,javascript,reactjs,jestjs,enzyme,Javascript,Reactjs,Jestjs,Enzyme,我正在努力学习笑话和酶,但我遇到了一个无法解决的问题,这是我的测试。。这不是很好,我知道,但我正在学习: import * as apiMock from '../api'; const fakePostId = '1'; const fakePersona = 'Fake'; jest.mock('../api', () => { return { fetchAllComments: jest.fn(() => { return
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);
}
componentDidMount
在shallow()期间被调用
这意味着在最初的shallow()
调用期间,将调用本地存储中的setcomments
,调用fetchAllComments
和filterComments
api
已被模拟,因此它会记录对fetchAllComments
和filterComments
的调用
一旦这一切发生,就会为本地存储中的setcomments创建间谍,并再次调用componentDidMount
(再次调用fetchAllComments
和filterComments
)
然后,setCommentsFromLocalStorage
的spy会正确地报告它被调用过一次(因为它只在第二次调用componentDidMount
时存在)
fetchAllComments
和filterComments
上的间谍随后正确地报告它们被调用了两次,因为它们在对componentDidMount
的两次调用中都存在
修复测试的最简单方法是在调用componentDidMount
之前清除fetchAllComments
和filterComments
上的mock:
apiMock.fetchAllComments.mockClear(); // clear the mock
apiMock.filterComments.mockClear(); // clear the mock
component.instance().componentDidMount();
expect(spySetComments).toHaveBeenCalledTimes(1); // SUCCESS
expect(apiMock.fetchAllComments).toHaveBeenCalledTimes(1); // SUCCESS
expect(apiMock.filterComments).toHaveBeenCalledTimes(1); // SUCCESS
在每次
之前和每次
之后使用分别模拟和模拟恢复间谍
这在Jest文档的一节中进行了解释。关于如何解决这个问题,有什么想法吗?首先删除行component.instance().componentDidMount()代码>我尝试将spy更改为const spySetComments=jest.spyOn(Comments.prototype,'setCommentsFromLocalStorage')
but only get无法监视setCommentsFromLocalStorage属性,因为它不是函数;未定义的给定instead@indiehjaerta是的,setCommentsFromLocalStorage
是一个实例属性,因此在实例存在之前它不会存在,但是在创建实例期间会调用componentDidMount
。因此,监视在componentDidMount
期间调用的实例属性需要设置spy并再次调用componentDidMount
。不过,您可以清除api间谍上的模拟。我用这个解决方案更新了我的答案。@indiehjaerta不客气,很高兴听到它很有用!
apiMock.fetchAllComments.mockClear(); // clear the mock
apiMock.filterComments.mockClear(); // clear the mock
component.instance().componentDidMount();
expect(spySetComments).toHaveBeenCalledTimes(1); // SUCCESS
expect(apiMock.fetchAllComments).toHaveBeenCalledTimes(1); // SUCCESS
expect(apiMock.filterComments).toHaveBeenCalledTimes(1); // SUCCESS