Estoy tratando de resolver los ámbitos de ejecución en las pruebas de broma.
Tengo un componente de reacción con la siguiente línea que se ejecuta durante el renderizado:
console.log(fun().m1());Aquí hay tres ejemplos de broma de pruebas.
import React from 'react'; import Enzyme, { shallow } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; import SimpleInput from './SimpleInput'; import { fun } from './util'; jest.mock('./util', () => ({ fun: jest.fn().mockImplementation(() => ({ m1: jest.fn() })), })); describe('SimpleInput', () => { test("should have '' initialValue by default", () => { const simpleInput = shallow(<SimpleInput />); expect(simpleInput.prop('value')).toBe(''); }); });Salir:
TypeError: Cannot read property 'm1' of undefinedSi muevo la implementación simulada a lo siguiente:
import React from 'react'; import Enzyme, { shallow } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; import SimpleInput from './SimpleInput'; import { fun } from './util'; jest.mock('./util'); describe('SimpleInput', () => { fun.mockImplementation(() => ({ m1: jest.fn() })); test("should have '' initialValue by default", () => { const simpleInput = shallow(<SimpleInput />); expect(simpleInput.prop('value')).toBe(''); }); });Salir:
TypeError: Cannot read property 'm1' of undefinedY finalmente:
import React from 'react'; import Enzyme, { shallow } from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; import SimpleInput from './SimpleInput'; import { fun } from './util'; jest.mock('./util'); describe('SimpleInput', () => { beforeEach(() => { fun.mockImplementation(() => ({ m1: jest.fn() })); }); test("should have '' initialValue by default", () => { const simpleInput = shallow(<SimpleInput />); expect(simpleInput.prop('value')).toBe(''); }); });Resultado: pasa.
Mi pregunta es si no puedo ejecutar la implementación simulada fuera de beforeEach o cada caso de prueba en particular, ¿cómo puedo agregar lo siguiente a los archivos de configuración de broma que parecen estar fallando en este momento?
Object.defineProperty(window, 'matchMedia', { writable: true, value: jest.fn().mockImplementation((query) => ({ matches: false, media: query, onchange: null, addListener, // Deprecated removeListener: jest.fn(), // Deprecated addEventListener: jest.fn(), removeEventListener: jest.fn(), dispatchEvent: jest.fn(), })), });En tal caso, es posible que desee utilizar jest.spyOn . Esto agregará un espía sobre el método original y luego podrá realizar cualquier tipo de burla que necesite :)
let performanceNowSpy beforeEach(() => { performanceNowSpy = jest.spyOn(window.performance, 'now') }) afterEach(() => { performanceNowSpy.mockReset() }) afterAll(() => { performanceNowSpy.mockRestore() }) test('meaningful test name', () => { performanceNowSpy.mockReturnValueOnce(0) // A simple example. // `performance.now()` can be called from another module too. expect(performance.now()).toBe(0) })