Tengo el siguiente componente donde, al hacer clic en el botón, busco realizar una copia en el portapapeles para el valor del texto.
Esto funciona bien y busca escribir una prueba para ello. Pero actualmente con mi prueba, sigue recibiendo el siguiente error:
Error: no capturado [Error de tipo: no se puede leer la propiedad 'entonces' de indefinido]
También probé otros ejemplos sugeridos aquí con el mismo resultado.
¿Cómo burlarse de navigator.clipboard.writeText() en Jest?
¿Podría obtener ayuda sobre lo que estoy haciendo mal, por favor? Gracias.
mi componente
import React, { useState } from 'react'; import { Button } from '../../Button'; const A = ({ text, }) => { const [copyStatus, setCopyStatus] = useState(''); const onClick = () => { window.navigator.clipboard.writeText(text) .then(() => { setCopyStatus('yes'); }) .catch(() => setCopyStatus('no')); }; const CopyBtn = () => ( <Button onClick={onClick}> Click </Button> ); return (<div> {CopyBtn} </div>); }; export default A;Mi prueba
import React from 'react'; import { mount } from 'enzyme'; import A from '../../../src/components/A'; jest.mock('../../Button', () => ({ Button: 'button', })); Object.defineProperty(navigator, "clipboard", { value: { writeText: () => {}, }, }); jest.spyOn(navigator.clipboard, "writeText"); describe('A component test', () => { const props = { text: 'mock', }; it('should copy to clipboard as expected', () => { const renderedModule = mount(<A {...props} />); // simulate does work. Which triggers the attempt to call navigator.clipboard.writeText and fails. renderedModule.find('button').simulate('click'); expect(navigator.clipboard.writeText).toBeCalledTimes(1); }); });La función simulada se está llamando realmente y necesita devolver una Promesa.
Podrías usar jest.fn para simular el comportamiento de la función.
Object.defineProperty(navigator, "clipboard", { value: { // Provide mock implementation writeText: jest.fn().mockReturnValueOnce(Promise.resolve(42)), }, }); Entonces no necesitas llamar a jest.spyOn .