在查看Jest问题和SO answers之后,我尝试了以下4个选项,但我要么得到TypeScript错误,要么得到运行时错误。我真的很想得到选项1(间谍)工作.
// ------ option 1 -----
// Gives this runtime error: "Cannot spyOn on a primitive value; undefined given"
const writeText = jest.spyOn(navigator.clipboard, 'writeText');
// ------ option 2 -----
Object.defineProperty(navigator, 'clipboard', {
writeText: jest.fn(),
});
// ------ option 3 -----
// This is from SO answer but gives a TypeScript error
window.__defineGetter__('navigator', function() {
return {
clipboard: {
writeText: jest.fn(x => x)
}
}
})
// ------ option 4 -----
const mockClipboard = {
writeText: jest.fn()
};
global.navigator.clipboard = mockClipboard;
5条答案
按热度按时间oyjwcjzk1#
Jest测试在JSdom环境中运行,并不是所有的属性都被定义,但是你应该在监视它之前定义函数。
下面是一个例子:
**编辑:**也可以使用
Object.defineProperty
,但它接受descriptors对象作为第三个参数g6ll5ycj2#
我对早期的解决方案进行了扩展,并给出了
readText
的模拟剪贴板功能,以便可以测试剪贴板的内容。下面是我的
test.js
文件的全部内容8xiog9wr3#
如果您使用
react-testing-library
:首先,安装
@testing-library/user-event
然后,导入用户事件,如下所示:
import userEvent from '@testing-library/user-event';
然后,例如:
f1tvaqid4#
我遇到了类似的情况,并使用以下方法在navigator对象中模拟剪贴板:
9q78igpj5#
在我的环境testing-library svelte和jest jsdom中,我没有设法模拟
global.navigator
。有效的解决方案是在我的测试中模拟window.navigator
。