嗨,我开发了一个使用电子和反应的项目,
我在react端有一个表单,它在提交时调用ipcRenderer.on是一个ipcRenderer.send方法。
我很难为表单提交功能编写单元测试代码。其功能如下。
handleFormSubmit = () => {
const ethData = this.state.data;
ipcRenderer.on('asynchronous-reply', (event, arg) => {
if (arg === 'success') {
this.setState({ status: true });
}
});
ipcRenderer.send('update', value);
}首先,我只想测试一下,在单击保存按钮时,调用handleFormSubmit函数。我写的是-
it('calls handleFormSubmit method when the form is submitted', () => {
const instance = wrapped.instance();
wrapped.find('button').simulate('click');
expect(instance.handleFormSubmit()).toHaveBeenCalled();
});我所犯的错误是
TypeError:无法读取未定义的.
的属性'on‘
发布于 2020-01-27 16:07:43
以下是单元测试解决方案:
index.jsx
import React, { Component } from 'react';
const { ipcRenderer } = require('electron');
class SomeComponent extends Component {
constructor(props) {
super(props);
this.state = { data: '', status: false };
}
handleFormSubmit = () => {
const ethData = this.state.data;
const value = 'value';
ipcRenderer.on('asynchronous-reply', (event, arg) => {
if (arg === 'success') {
this.setState({ status: true });
}
});
ipcRenderer.send('update', value);
};
render() {
return <form onSubmit={this.handleFormSubmit}></form>;
}
}
export default SomeComponent;index.test.jsx
import { shallow } from 'enzyme';
import React from 'react';
import SomeComponent from '.';
const { ipcRenderer } = require('electron');
jest.mock(
'electron',
() => {
const mElectron = { ipcRenderer: { on: jest.fn(), send: jest.fn() } };
return mElectron;
},
{ virtual: true },
);
describe('59934084', () => {
let wrapper;
beforeEach(() => {
wrapper = shallow(<SomeComponent></SomeComponent>);
});
it('should render', () => {
expect(wrapper.exists).toBeTruthy();
});
it('should handle submit, set status to true', () => {
ipcRenderer.on.mockImplementationOnce((event, callback) => {
callback(event, 'success');
});
wrapper.find('form').simulate('submit');
expect(wrapper.state('status')).toBeTruthy();
expect(ipcRenderer.on).toBeCalledWith('asynchronous-reply', expect.any(Function));
expect(ipcRenderer.send).toBeCalledWith('update', 'value');
});
it('should handle submit without setting status to true', () => {
ipcRenderer.on.mockImplementationOnce((event, callback) => {
callback(event, 'failure');
});
wrapper.find('form').simulate('submit');
expect(wrapper.state('status')).toBeFalsy();
expect(ipcRenderer.on).toBeCalledWith('asynchronous-reply', expect.any(Function));
expect(ipcRenderer.send).toBeCalledWith('update', 'value');
});
});100%覆盖范围的单元测试结果:
PASS src/stackoverflow/59934084/index.test.jsx (14.089s)
59934084
✓ should render (22ms)
✓ should handle submit, set status to true (14ms)
✓ should handle submit without setting status to true (4ms)
-----------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
-----------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
index.jsx | 100 | 100 | 100 | 100 | |
-----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 3 passed, 3 total
Snapshots: 0 total
Time: 16.114s, estimated 19s如果安装了{ virtual: true }节点模块,则不需要将electron选项传递给electron方法。只要把它移开。我使用此选项的原因是我没有安装electron节点模块并为您做一个示例。
源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59934084
https://stackoverflow.com/questions/59934084
复制相似问题