Wie kann ich meinen Tests in Jest Canvas-Unterstützung hinzufügen?

8

In meinem Jest Komponententest rende ich eine Komponente mit einem ColorPicker . Die ColorPicker -Komponente erstellt ein Canvas-Objekt und einen 2d-Kontext, gibt aber 'undefined' zurück, wodurch der Fehler "Cannot set property 'fillStyle' of undefined"

ausgegeben wird %Vor%

Ich habe Probleme herauszufinden, warum ich keinen 2d Kontext bekommen kann. Vielleicht gibt es ein Problem mit meiner Testkonfiguration?

%Vor%     
Adgezaza 21.10.2015, 20:57
quelle

4 Antworten

8

Das liegt daran, dass Ihr Test nicht in einem echten Browser ausgeführt wird. Jest verwendet jsdom , um die notwendigen Teile des DOM zu verspotten, um die Tests in Node ausführen zu können, wodurch die Stilberechnung und das Rendern vermieden werden, die ein Browser normalerweise ausführen würde. Das ist cool, weil das Tests schnell macht.

Andererseits, wenn Sie Browser-APIs in Ihren Komponenten benötigen, ist es schwieriger als im Browser. Zum Glück hat jsdom Unterstützung für Canvas . Sie müssen es nur konfigurieren:

  

jsdom bietet Unterstützung für die Verwendung des Canvas-Pakets , um alle <canvas> -Elemente mit der Canvas-API zu erweitern. Damit dies funktioniert, müssen Sie Canvas als Abhängigkeit in Ihr Projekt als Peer von jsdom einbeziehen. Wenn jsdom das Canvas-Paket finden kann, wird es es verwenden, aber wenn es nicht vorhanden ist, verhalten sich <canvas> -Elemente wie <div> s.

Alternativ könntest du Jest durch einen browserbasierten Test-Runner wie Karma ersetzen. Scherz ist ziemlich Buggy sowieso.

    
mik01aj 22.10.2015, 10:18
quelle
1

Ich hatte genau das gleiche Problem. Ich implementiere nach gitlab ci, um meine Tests zu starten, und da npm canvas eine Installation von Cairo erfordert, war das keine praktikable Option.

Alles, was ich wirklich tun wollte, war, die Implementierung durch Jest zu verspotten, so dass sie nicht wirklich versucht, einen echten Kontext zu schaffen. Hier ist, wie ich es gelöst habe:

wurde zu package.json hinzugefügt

%Vor%

tests / setup.js

%Vor%     
Donald White 03.10.2017 22:35
quelle
1

Für meinen Anwendungsfall habe ich einfach Affen gepatcht wie folgt

%Vor%

Es ist nicht erforderlich, Canvas-Prebuilt oder Sinon zu installieren.

    
Andzej Maciusovic 26.10.2017 12:01
quelle
0

Ich denke, Sie brauchen jest-canvas-mock .

Installieren

Dies sollte nur als Entwicklungsabhängigkeit (devDependencies) installiert werden, da es nur zum Testen entwickelt wurde.

  

npm ich --save-dev jest-canvas-mock

Einrichtung

Erstellen Sie in Ihrer package.json unter dem Scherz ein setupFiles-Array und fügen Sie dem Array jest-canvas-mock hinzu.

%Vor%

Wenn Sie bereits ein setupFiles-Attribut haben, können Sie auch jest-canvas-mock an das Array anhängen.

%Vor%     
atool 25.12.2017 12:49
quelle

Tags und Links