首页 > 解决方案 > 无法使用 sinon 从“复制到剪贴板”测试副本

问题描述

我正在尝试使用 Sinon 测试我的组件。看来我无法模拟 TableMenu 组件中的单击功能。 表菜单.jsx

import copy from 'copy-to-clipboard';

const TableMenu = ({onClick, onHide, rowId}) => (
    <MenuPopover
        onClick={onClick}
        onHide={onHide}>
        <MenuPopover.Item id={1} onClick={() => copy(rowId)} label='Copy'/>
    </MenuPopover>
);

TableMenu.test.js

import copy from 'copy-to-clipboard';
jest.mock('copy-to-clipboard', () => sinon.spy());

it('check method onCopy called', () => {
    const wrapper = shallow(<TableMenu {...props}/>);
    wrapper.find(MenuPopover.Item).last().props().onClick()
    expect(copy.calledOnce).to.eql(true);
});

我收到以下错误:

Error: Not implemented: window.prompt
    at module.exports (C:\adm\node_modules\jsdom\lib\jsdom\browser\not-implemented.js:9:17)
    at Window.prompt (C:\adm\node_modules\jsdom\lib\jsdom\browser\Window.js:458:7)
    at copy (C:\adm\node_modules\copy-to-clipboard\index.js:58:14)
    at Object.onClick (C:\adm\src\TableMenu/TableMenu.jsx:19:43)
    ...
    ...

TypeError: reselectPrevious is not a function
    at copy (node_modules\copy-to-clipboard\index.js:72:5)
    at Object.onClick (src\TableMenu/TableMenu.jsx:19:43)
    at Context.<anonymous> (src\TableMenu/TableMenu.test.js:62:62)
    at process.topLevelDomainCallback (domain.js:121:23)

标签: reactjstestingjestjsenzymesinon

解决方案


我想这正在github repo中讨论,潜在的解决方案可能是#106(评论)

或者,只是简单地模拟 window.prompt 的实现。例如

jest.spyOn(window, 'prompt').mockImplementation();

推荐阅读