2017-10-17 12 views
1

La mise en œuvre jest tests instantanés dans une application electron-react i courir dans une erreur:Unité-test app électronique-REACT avec Jest, TypeError: ne peut pas correspondre à contre 'non défini' ou 'null'

TypeError: Cannot match against 'undefined' or 'null'.

je peux » t trouver un moyen de faire fonctionner les tests lorsqu'un composant React contient electron éléments de navite tels que shell, Menu, MenuItem.

J'ai essayé passer shell comme un accessoire, comme dans le code commenté dans Home.spec.j s, mais il n'y a pas de changement.

Home.js

import React, { Component } from 'react'; 
import { remote } from 'electron'; 
const { shell } = remote; 

export default class Home extends Component { 
    openLink() { 
     shell.openExternal('https://www.facebook.com') 
    } 

    render() { 
     return (
      <div> 
       <button onClick={() => this.openLink()}> 
        Open External 
       </button> 
      </div> 
     ) 
    } 
} 

Home.spec.js

import React from 'react'; 
import renderer from 'react-test-renderer'; 

import Home from '../../app/components/Home'; 

// import { remote } from 'electron' 
// const { shell } = remote; 

describe('Counter component',() => { 
    it('should render snapshot',() => { 
     const component = renderer.create(
      <Home /> 
      //<Home shell={shell} /> 
     ) 
     const tree = component.toJSON() 
     expect(tree).toMatchSnapshot() 
    }) 
}); 
+0

Est-ce que tout fonctionne si vous supprimez toutes les parties électroniques de votre appareil? – kontrollanten

+0

Oui, la suppression des tests des pièces électroniques fonctionne bien. –

+2

Okey. Ne serait-il pas préférable de garder les composants Electron à l'extérieur des composants React? Vous pouvez soit utiliser des répartiteurs et écouter des événements ou simplement écouter l'événement webviews 'new-window' pour lancer' openExternal'. – kontrollanten

Répondre

1

Pour maintenir la séparation dans votre demande, je propose que vous ne confondez pas Electron et réagissez les pièces. En fonction de votre application, deux solutions peuvent être:

  1. Utilisez les répartiteurs pour envoyer des événements à partir de vos composants React et exécuter les actions à partir de fonctions JS pures.
  2. Ecoute de l'événement new-window sur le WebView vous rendu, et de cet événement exécuté openExternal

Example from Electron:

const {shell} = require('electron') 
const webview = document.querySelector('webview') 

webview.addEventListener('new-window', (e) => { 
    const protocol = require('url').parse(e.url).protocol 
    if (protocol === 'http:' || protocol === 'https:') { 
    shell.openExternal(e.url) 
    } 
})