Saltar al contenido

¿Hay alguna forma de simular funciones privadas con Jest?

Si te encuentras con algún detalle que te causa duda puedes comentarlo y haremos todo lo posible de ayudarte tan rápido como podamos.

Solución:

Descubrí una manera de burlarme de mi función privada usando el babel-plugin-rewire módulo.

En paquete.json tengo lo siguiente:

  "devDependencies": {
    ...
    "babel-plugin-rewire": "1.0.0-beta-5",
    "babel-jest": "18.0.0",
    ...

En .babel.rc tengo lo siguiente:

{
  "presets": [
    "es2015",
    "stage-0",
    "react"
  ],
  "env": 
    "test": 
      "plugins": [
        "babel-plugin-rewire"
      ]
    
  ,
  ...

En este punto pude burlarme de la función privada:

import * as moduleToTest from './moduleToTest.js'

describe('#publicFunction', () => 
  it('mocks private function', () => 
    moduleToTest.__Rewire__('privateFunction', () =>  console.log('I am the mocked private function') )
    ...
  )
)

No hay manera a través de la naturaleza de JavaScript. La función está vinculada al alcance del módulo, por lo que no hay forma de saber que esta función existe desde el exterior, por lo que no hay forma de acceder a la función y, al final, no hay forma de burlarse de ella.

Quizás lo más importante es que no debe probar las partes internas del objeto bajo prueba, sino solo la API pública. Porque eso es todo lo que cuenta. A nadie le importa cómo se hacen las cosas internamente mientras la API pública se mantenga estable.

Si desea simular una función privada, intente usar prototipo. Por ejemplo, necesitas burlarte función privada de la próxima clase:

export class Module 
    public publicFunction() 
        // do something
        this.privateFunction();
        // do something
    

    private privateFunction() 
        // do something
    
  

Así que deberías usar Módulo.prototipo en broma.espiar función.

import  Module  from "./my-module";

describe('MyModule', () => 
it('test public function', () => 
    // Arrange
    const module = new Module()
    const myPrivateFunc = jest.spyOn(Module.prototype as any, 'privateFunction');
    myPrivateFunc.mockImplementation(() => );

    // Act
    module.publicFunction();

    // Assert
    expect(myPrivateFunc).toHaveBeenCalled();
  );
);

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *