How to mock navigator.clipboard.writeText() in Jest?
Solution 1:
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:
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");
});
});
});
Edit: you can also use Object.defineProperty
, but it accepts descriptors object as third parameter
Object.defineProperty(navigator, "clipboard", {
value: {
writeText: () => {},
},
});
Solution 2:
I ran into a similar situation and used the following method to mock the clipboard in the navigator object:
const originalClipboard = { ...global.navigator.clipboard };
const mockData = {
"name": "Test Name",
"otherKey": "otherValue"
}
beforeEach(() => {
const mockClipboard = {
writeText: jest.fn(),
};
global.navigator.clipboard = mockClipboard;
});
afterEach(() => {
jest.resetAllMocks();
global.navigator.clipboard = originalClipboard;
});
test("copies data to the clipboard", () => {
copyData(); //my method in the source code which uses the clipboard
expect(navigator.clipboard.writeText).toBeCalledTimes(1);
expect(navigator.clipboard.writeText).toHaveBeenCalledWith(
JSON.stringify(mockData)
);
});