单元测试电子反应应用程序与Jest,TypeError:无法匹配'undefined'或'null'

时间:2017-10-17 07:53:39

标签: javascript reactjs unit-testing electron jest

jest应用中实施electron-react快照测试时遇到错误:

  

TypeError:无法与'undefined'或'null'匹配。

React组件包含electron导航元素(例如shell, Menu, MenuItem)时,我找不到任何方法让测试正常工作。

我已尝试将shell作为道具传递,与 Home.spec.j 中的注释代码一样,但没有变化。

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()
    })
});

1 个答案:

答案 0 :(得分:1)

为了保持应用程序的分离,我建议你不要混淆Electron和React部件。根据您的应用,可能有两种解决方案:

  1. 使用调度程序从React组件发送事件并从纯JS函数运行操作。
  2. 在您正在呈现的WebView上侦听new-window事件,并从该事件运行openExternal
  3. 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)
      }
    })