gpt4 book ai didi

typescript - 如何在 Jest 中模拟 navigator.clipboard.writeText()?

转载 作者:行者123 更新时间:2023-12-03 13:44:43 32 4
gpt4 key购买 nike

在查看了 Jest 问题和 SO answers 后,我尝试了以下 4 个选项,但我遇到了 TypeScript 错误或运行时错误。我真的很想让选项 1 (spyOn) 工作。

// ------ 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;

最佳答案

Jest测试在JSdom环境中运行,并且并非所有属性都已定义,但是您应该在监听该函数之前先定义该函数。

这是一个例子:

Object.assign(navigator, {
clipboard: {
writeText: () => {},
},
});

describe("Clipboard", () => {
describe("writeText", () => {
jest.spyOn(navigator.clipboard, "writeText");
beforeAll(() => {
yourImplementationThatWouldInvokeClipboardWriteText();
});
it("should call clipboard.writeText", () => {
expect(navigator.clipboard.writeText).toHaveBeenCalledWith("zxc");
});
});
});

编辑:也可以使用 Object.defineProperty,但是它接受描述符对象作为第三个参数
Object.defineProperty(navigator, "clipboard", {
value: {
writeText: () => {},
},
});

关于typescript - 如何在 Jest 中模拟 navigator.clipboard.writeText()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62351935/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com