Estoy bastante confundido con la burla en Jest y cómo probar las implementaciones por unidad. La cosa es que quiero burlarme de diferentes comportamientos esperados.
¿Hay alguna manera de lograr esto? ya que las importaciones solo pueden estar en la parte superior del archivo y para poder burlarse de algo, debe declararse antes de la importación. También intenté pasar una función local para poder sobrescribir el comportamiento, pero jest se queja de que no puedes pasar nada local.
jest.mock('the-package-to-mock', () => ({ methodToMock: jest.fn(() => console.log('Hello')) })); import * as theThingToTest from '../../../app/actions/toTest' import * as types from '../../../app/actions/types' it('test1', () => { expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE) }) it('test2', () => { //the-package-to-mock.methodToMock should behave like something else expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE) }) internamente, como puede imaginar, theThingToTest.someAction() usa the-package-to-mock.methodToMock
Puede simular con un espía e importar el módulo simulado. En su prueba, establece cómo debe comportarse el simulacro usando mockImplementation :
jest.mock('the-package-to-mock', () => ({ methodToMock: jest.fn() })); import { methodToMock } from 'the-package-to-mock' it('test1', () => { methodToMock.mockImplementation(() => 'someValue') }) it('test2', () => { methodToMock.mockImplementation(() => 'anotherValue') })Yo uso el siguiente patrón:
'use strict' const packageToMock = require('../path') jest.mock('../path') jest.mock('../../../../../../lib/dmp.db') beforeEach(() => { packageToMock.methodToMock.mockReset() }) describe('test suite', () => { test('test1', () => { packageToMock.methodToMock.mockResolvedValue('some value') expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE) }) test('test2', () => { packageToMock.methodToMock.mockResolvedValue('another value') expect(theThingToTest.someAction().type).toBe(types.OTHER_TYPE) }) })Explicación:
Se burla de la clase que está tratando de usar en el nivel del conjunto de pruebas, asegúrese de que el simulacro se restablezca antes de cada prueba y para cada prueba use mockResolveValue para describir lo que se devolverá cuando se devuelva el simulacro.
Otra forma es usar jest.doMock(moduleName, factory, options) .
P.ej
the-package-to-mock.ts :
export function methodToMock() { return 'real type'; } toTest.ts :
import { methodToMock } from './the-package-to-mock'; export function someAction() { return { type: methodToMock(), }; } toTest.spec.ts :
describe('45006254', () => { beforeEach(() => { jest.resetModules(); }); it('test1', () => { jest.doMock('./the-package-to-mock', () => ({ methodToMock: jest.fn(() => 'type A'), })); const theThingToTest = require('./toTest'); expect(theThingToTest.someAction().type).toBe('type A'); }); it('test2', () => { jest.doMock('./the-package-to-mock', () => ({ methodToMock: jest.fn(() => 'type B'), })); const theThingToTest = require('./toTest'); expect(theThingToTest.someAction().type).toBe('type B'); }); });resultado de la prueba unitaria:
PASS examples/45006254/toTest.spec.ts 45006254 ✓ test1 (2016 ms) ✓ test2 (1 ms) -----------|---------|----------|---------|---------|------------------- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s -----------|---------|----------|---------|---------|------------------- All files | 100 | 100 | 100 | 100 | toTest.ts | 100 | 100 | 100 | 100 | -----------|---------|----------|---------|---------|------------------- Test Suites: 1 passed, 1 total Tests: 2 passed, 2 total Snapshots: 0 total Time: 3.443 scódigo fuente: https://github.com/mrdulin/jest-v26-codelab/tree/main/examples/45006254