在模拟 window 导航器对象上操作时出现未定义错误
Getting undefined error when operating on a mocked window navigator object
我有以下组件,在单击按钮时,我希望将文本值复制到剪贴板。
这工作正常,希望为它编写测试。但是目前在我的测试中,不断出现以下错误:
Error: Uncaught [TypeError: Cannot read property 'then' of undefined]
还尝试了此处建议的其他示例,结果相同。
请问我做错了什么可以得到一些帮助吗?谢谢。
我的组件
import React, { useState } from 'react';
import { Button } from '../../Button';
const A = ({
text,
}) => {
const [copyStatus, setCopyStatus] = useState('');
const onClick = () => {
window.navigator.clipboard.writeText(text)
.then(() => {
setCopyStatus('yes');
})
.catch(() => setCopyStatus('no'));
};
const CopyBtn = () => (
<Button onClick={onClick}>
Click
</Button>
);
return (<div>
{CopyBtn}
</div>);
};
export default A;
我的测试
import React from 'react';
import { mount } from 'enzyme';
import A from '../../../src/components/A';
jest.mock('../../Button', () => ({
Button: 'button',
}));
Object.defineProperty(navigator, "clipboard", {
value: {
writeText: () => {},
},
});
jest.spyOn(navigator.clipboard, "writeText");
describe('A component test', () => {
const props = {
text: 'mock',
};
it('should copy to clipboard as expected', () => {
const renderedModule = mount(<A {...props} />);
// simulate does work. Which triggers the attempt to call navigator.clipboard.writeText and fails.
renderedModule.find('button').simulate('click');
expect(navigator.clipboard.writeText).toBeCalledTimes(1);
});
});
模拟函数正在被实际调用,它需要 return 一个 Promise。
您可以使用 jest.fn
模拟函数行为。
Object.defineProperty(navigator, "clipboard", {
value: {
// Provide mock implementation
writeText: jest.fn().mockReturnValueOnce(Promise.resolve(42)),
},
});
那你就不用调用jest.spyOn
了。
我有以下组件,在单击按钮时,我希望将文本值复制到剪贴板。
这工作正常,希望为它编写测试。但是目前在我的测试中,不断出现以下错误:
Error: Uncaught [TypeError: Cannot read property 'then' of undefined]
还尝试了此处建议的其他示例,结果相同。
请问我做错了什么可以得到一些帮助吗?谢谢。
我的组件
import React, { useState } from 'react';
import { Button } from '../../Button';
const A = ({
text,
}) => {
const [copyStatus, setCopyStatus] = useState('');
const onClick = () => {
window.navigator.clipboard.writeText(text)
.then(() => {
setCopyStatus('yes');
})
.catch(() => setCopyStatus('no'));
};
const CopyBtn = () => (
<Button onClick={onClick}>
Click
</Button>
);
return (<div>
{CopyBtn}
</div>);
};
export default A;
我的测试
import React from 'react';
import { mount } from 'enzyme';
import A from '../../../src/components/A';
jest.mock('../../Button', () => ({
Button: 'button',
}));
Object.defineProperty(navigator, "clipboard", {
value: {
writeText: () => {},
},
});
jest.spyOn(navigator.clipboard, "writeText");
describe('A component test', () => {
const props = {
text: 'mock',
};
it('should copy to clipboard as expected', () => {
const renderedModule = mount(<A {...props} />);
// simulate does work. Which triggers the attempt to call navigator.clipboard.writeText and fails.
renderedModule.find('button').simulate('click');
expect(navigator.clipboard.writeText).toBeCalledTimes(1);
});
});
模拟函数正在被实际调用,它需要 return 一个 Promise。
您可以使用 jest.fn
模拟函数行为。
Object.defineProperty(navigator, "clipboard", {
value: {
// Provide mock implementation
writeText: jest.fn().mockReturnValueOnce(Promise.resolve(42)),
},
});
那你就不用调用jest.spyOn
了。