如何在玩笑中模拟navigator.clipboard.writeText()?

问题描述 投票:2回答:1

在查看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;
typescript jestjs jsdom jest-dom
1个回答
0
投票

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");
    });
  });
});

Edit:您也可以使用Object.defineProperty,但它接受描述符对象作为第三个参数

Object.defineProperty(navigator, "clipboard", {
  value: {
    writeText: () => {},
  },
});
© www.soinside.com 2019 - 2024. All rights reserved.