Mock PrimeNg ChartModule con Spectator
Arcadio Quintero

Arcadio Quintero @oidacra

About: Angular Developer • System Engineer • With over 16 years of experience in web development.

Location:
Ontario, Canada
Joined:
May 31, 2019

Mock PrimeNg ChartModule con Spectator

Publish Date: Jul 21 '23
0 0

Recientemente, migramos algunas librerías a Jest y nos encontramos con problemas en los tests que habíamos creado para un componente que utilizaba el módulo de gráficos de PrimeNg (que a su vez es un wrapper de ChartJS).

A primera vista, identificamos que el problema radicaba en la falta de soporte de Jest para Canvas, MutationObserver y otras APIs del navegador necesarias para ejecutar los tests (Usábamos Karma).

Finalmente, nos dimos cuenta de que teníamos dos opciones: hacer mock de estas APIs del navegador o hacer mock del módulo de ChartModule. Como estábamos utilizando Spectator para realizar los tests, logramos hacerlo fácilmente (después de mucha búsqueda, prueba y error).

En primer lugar, creamos un mock para reemplazar lo que necesitábamos. En este caso, dado que PrimeNG sigue utilizando módulos, creamos un componente y un módulo de prueba específicamente para este propósito.

// Componente que contiene chart.js en ChartModule de PrimeNG
@Component({
    selector: 'p-chart',
    template: 'PrimeNg Chart - mocked component'
})
class MockUIChart {
    // Aquí agregamos todos los imputs que estemos utilizando
    @Input()
    data: unknown;
    @Input()
    options: unknown;
    @Input()
    plugins: unknown;
}
// Módulo que importa y exporta el componente
@NgModule({
    declarations: [MockUIChart],
    exports: [MockUIChart]
})
export class MockChartModule {}
Enter fullscreen mode Exit fullscreen mode

Y en nuestro test hacemos:

describe('ComponentStandalone', () => {
    let spectator: Spectator<ComponentStandalone>;

    const createComponent = createComponentFactory({
        component: ComponentStandalone,
        overrideComponents: [
            [
                ComponentStandalone,
                {
                    remove: { imports: [ChartModule] },
                    add: { imports: [MockChartModule] }
                }
            ]
        ]
    });
});
Enter fullscreen mode Exit fullscreen mode

Con esto evitamos que el componente de p-chart en el OnInit trate de instanciar ChartJS que era la raíz de todos los warnings en Jest.

¿Tienes alguna experiencia con Jest, PrimeNg o herramientas de testing que te gustaría compartir? ¡Déjame tus comentarios!

Comments 0 total

    Add comment