如何在Jest中模拟此方法链?

时间:2018-08-20 00:38:40

标签: javascript reactjs ecmascript-6 jestjs enzyme

zoomOut(callback) {
        // Zooms out the current screen
        this.view.current.zoomOut(300).done(() => {
            (hasCallback(callback)) && callback();
        });
    }

我正在尝试测试上面的功能,但我不断收到以下错误:

  

TypeError:this.view.current.zoomOut(...)。done不是函数

如何在Jest中模拟此方法链?

2 个答案:

答案 0 :(得分:2)

您可以尝试以下方法:

const mockZoomOut = jest.fn(() => ({ done(cb) { cb(); } }));
const mockThis = {
    view: {
        current: {
            zoomOut: mockZoomOut,
        },
    },
};

test('it does', () => {
    const cb = jest.fn();
    zoomOut.apply(mockThis, [cb]);
    expect(mockZoomOut).toHaveBeenCalledTimes(1);
    expect(cb).toHaveBeenCalledTimes(1);
});

请参见Jest Mock Functionsfn.apply

如果您要测试整个类的行为,则可以将要测试的实例设置为以某种方式使this.view.current.zoomOutmockZoomOut

答案 1 :(得分:2)

由于BudgieInWA,我能够通过返回done来解决此问题。

对于那些正在使用酶测试React组件的人,您可以按照以下方法进行操作:

it('should call callback', () => {
    const wrapper = shallow(<Zoom {...minProps}/>);
    const instance = wrapper.instance();

    const callback = jest.fn();

    instance.view = {
        current: {
            zoomOut: jest.fn(() => {
                return {
                    done: jest.fn((callback) => {
                        callback();
                    })
                };
            })
        }
    };

    expect(callback).toHaveBeenCalledTimes(0);
    instance.zoomOut(callback);
    expect(callback).toHaveBeenCalledTimes(1);
});