Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用jest和x2B进行测试;例如,mock函数被调用两次是没有原因的_Javascript_Reactjs_Jestjs_Enzyme - Fatal编程技术网

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