酶/笑话静态方法模拟未运行

时间:2019-07-09 09:13:51

标签: javascript typescript unit-testing jestjs enzyme

我正在尝试测试一种导入的静态方法,该方法应该在单击按钮时运行。这是应该在其上运行测试的组件:

const NextButton = (props: ISubmitButtonProps) => (
    <button
        onClick={Service.goToNext}
        className="col-2 submit"
        type="submit"
        disabled={props.submitting}>
        Next
    </button>
);

export default NextButton;

现在,我想测试方法goToNext是否正在实际运行。 为此,我使用了here中的示例,并添加了一个看起来不错的模拟,像这样:

const goToNextMock = jest.fn();
jest.mock('Services/service', () => ({
        default: class {
            public static goToNext() {
                goToNextMock(); //the jest.fn from above
            }
        }
    })
);

然后为它编写测试,只需模拟click事件,然后检查jest.fn()是否已运行:

it('should call goToNext on button click', () => {
        //button is set before as shallow(<NextButton submitting={false}/>);
        button.simulate('click');
        expect(goToNext).toHaveBeenCalled();
    })

问题是,原因未知,测试无法持续。给我一个

  

预期已调用的模拟函数。

编辑:尝试以这种方式进行模拟时,会出现相同的结果(请注意其他preventDefault()

it('should call goToNextReport on button click', () => {
    const mock = jest.fn();
    Service.goToNext = mock.bind(Service);

    button.simulate('click', { preventDefault() {} });

    expect(mock).toHaveBeenCalled();
})

我对JEST和JS测试还很陌生。似乎模拟已正确完成,但仍然无法检查方法。

关于这个主题有什么想法吗? 所有帮助将是惊人的! 编辑:问题也已提交到JEST github频道:https://github.com/facebook/jest/issues/8695

1 个答案:

答案 0 :(得分:1)

尝试一下:

jest.mock('Services/service', () => ({
    goToNext: jest.fn()
}));