Jest tests are running in JSdom environment and not all of the properties are defined, but so you should define the function before spying on it.
Here is an example:
const writeText = jest.fn()
Object.assign(navigator, {
clipboard: {
writeText,
},
});
describe("Clipboard", () => {
describe("writeText", () => {
beforeAll(() => {
navigator.clipboard.writeText.mockResolvedValue(undefined)
// or if needed
// navigator.clipboard.writeText.mockRejectedValue(new Error())
yourImplementationThatWouldInvokeClipboardWriteText();
});
it("should call clipboard.writeText", () => {
expect(navigator.clipboard.writeText).toHaveBeenCalledWith("zxc");
});
});
});
Edit: you can also use Object.defineProperty, but it accepts descriptors object as third parameter
Object.defineProperty(navigator, "clipboard", {
value: {
writeText: async () => {},
},
});