- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个 Electron 应用程序,前端使用 React,运行测试使用 JEST + React 测试库。我在模块中有以下简化代码:
import React from 'react';
import { ipcRenderer } from 'electron';
import Paper from '@material-ui/core/Paper';
import LinearProgress from '@material-ui/core/LinearProgress';
const AccountCheckModule = () => {
const [listingsCount, setListingsCount] = React.useState(0);
React.useEffect(() => {
ipcRenderer.on('count-listings', (event, count) => {
setListingsCount(count);
});
ipcRenderer.send('count-listings');
// Cleanup the listener events so that memory leaks are avoided.
return function cleanup() {
ipcRenderer.removeAllListeners('count-listings');
};
}, []);
return (
<Paper elevation={2} data-testid="paper">
<p
className={classes.listingsNumberTracker}
data-testid="free-listings-counter"
>
Free listings: {listingsCount}/100
</p>
<BorderLinearProgress
className={classes.margin}
variant="determinate"
color="secondary"
value={listingsCount}
data-testid="border-linear-progress"
/>
</Paper>
);
};
export default AccountCheckModule;
基本上,React.useEffect()
运行一次,调用 ipcRenderer.send('count-listings');
并设置一个监听器等待来自主要过程。主进程以列表计数作为响应,并在收到时用于更新 listingsCount 状态 -> setListingsCount(count)
是否可以使用 Jest 模拟此监听器函数以返回“计数”数字。
ipcRenderer.on('count-listings', (event, count) => {
setListingsCount(count);
});
如果是,您将如何实现这一目标?
最佳答案
这是一个单元测试解决方案,我创建了一个简单的 electron
模块来模拟真实的 electron
节点模块并简化您的组件 JSX 元素。
例如
index.tsx
:
import React from 'react';
import { ipcRenderer } from './electron';
const AccountCheckModule = () => {
const [listingsCount, setListingsCount] = React.useState(0);
React.useEffect(() => {
ipcRenderer.on('count-listings', (event, count) => {
setListingsCount(count);
});
ipcRenderer.send('count-listings', 2);
// Cleanup the listener events so that memory leaks are avoided.
return function cleanup() {
ipcRenderer.removeAllListeners('count-listings');
};
}, []);
return <div>{listingsCount}</div>;
};
export default AccountCheckModule;
electron.ts
:
export const ipcRenderer = {
events: {},
on(event, handler) {
this.events[event] = handler;
},
send(event, data) {
this.events[event](event, data);
},
removeAllListeners(event) {
this.events[event] = undefined;
}
};
index.spec.tsx
:
import React from 'react';
import { render, act } from '@testing-library/react';
import { ipcRenderer } from './electron';
import AccountCheckModule from './';
describe('AccountCheckModule', () => {
afterEach(() => {
jest.restoreAllMocks();
});
it('should render correct', async () => {
const events = {};
const onSpy = jest.spyOn(ipcRenderer, 'on').mockImplementation((event, handler) => {
events[event] = handler;
});
const sendSpy = jest.spyOn(ipcRenderer, 'send').mockImplementation((event, data) => {
events[event](event, data);
});
const { getByText, container } = render(<AccountCheckModule></AccountCheckModule>);
const mCount = 666;
act(() => {
ipcRenderer.send('count-listings', mCount);
});
const element = getByText(mCount.toString());
expect(element).toBeDefined();
expect(onSpy).toBeCalledWith('count-listings', expect.any(Function));
expect(sendSpy).toBeCalledWith('count-listings', mCount);
expect(container).toMatchSnapshot();
});
});
SFC 100% 覆盖率报告的单元测试结果:
PASS src/stackoverflow/58048849/index.spec.tsx
AccountCheckModule
✓ should render correct (47ms)
-------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
-------------|----------|----------|----------|----------|-------------------|
All files | 88.89 | 100 | 71.43 | 87.5 | |
electron.ts | 50 | 100 | 33.33 | 50 | 4,7 |
index.tsx | 100 | 100 | 100 | 100 | |
-------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 1 passed, 1 total
Time: 4.247s, estimated 11s
index.spec.tsx.snap
:
// Jest Snapshot v1
exports[`AccountCheckModule should render correct 1`] = `
<div>
<div>
666
</div>
</div>
`;
源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58048849
关于reactjs - 如何在 React 功能组件中模拟 ipcRenderer.on 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58048849/
我的渲染过程中有以下内容: class Component { findClosestComponent(c) { /* Do stuff */ } } class Item extends
您好,我正在使用 Electron 和 React 开发一个项目, 我在 react 端有一个表单,在提交时调用 ipcRenderer.on 一个 ipcRenderer.send 方法。 我在为表
我正在尝试使用 IPC 在我的 react 组件和主 Electron 过程之间进行通信。 In component : export default class A extends React.Co
我可以看到“来自渲染器的你好”警报,但看不到“来自渲染器的再见”警报。 在 Windows 10 中运行。 而且我看不到“已收到!”警报,我应该看到 ipcRenderer.on(...) 起作用了。
我有一个带有构造函数和异步函数的类。 我已经完成了module.exports这样我就可以从我的 GUI.js 调用我的类(class)文件和我的GUI.js文件,我需要那个类,一切正常。 但是在我的
我正在做我的第一个 Electron 应用程序-使用Git中的 Electron 快速启动代码。 我无法将事件从preload.js发送到main.js 我成功地将邮件从main.js发送到prelo
所以显然使用 remote 是一种不好的做法。 Electron 中的模块,他们正计划杀死它。他们说ipcRenderer应该使用模块。 但是ipc的东西是一个事件系统。 如果在预加载脚本中我需要从主
我正在(第一次)使用 Electron 创建一个仅限 Mac 的小型应用程序。 我正在尝试使用 ipcRenderer 在我的应用程序菜单和主 BrowserWindow 中的内容之间进行通信。 我将
我有一个使用 Electron、React 和 React Router 的应用程序。我在组件构造函数中使用 ipcRenderer 将事件从组件发送到主 Electron 进程。将 React Ro
我正在使用 Electron + Vue 来构建我的应用程序。我向主进程发送一条消息以创建一个新窗口。在 main 的方法中,我试图将消息传递给新创建的窗口,但它不起作用。 我在主浏览器窗口中的 Ho
在我的主机应用程序中,我有一个按钮,单击该按钮后,会将数据连同数据一起发送到我的 Angular 应用程序。像这样: Send Some Data 组件: onClick() { ipcRender
我正在尝试做一个简单的 ipc.send 和 ipc.on 但由于某种原因我在这个 Electron 需求上变得不确定。 库/自定义菜单.js: 'use-strict'; const Browser
我想知道如何在 Electron 应用程序上通过 ipcRenderer 发送多个参数。我应该发送一个参数数组还是只发送用逗号分隔的所有参数? 谢谢, 最佳答案 我会推荐一个用于参数传输的对象。因此,
我正在尝试了解 Electron 主进程和渲染器进程之间的通信。文档 https://github.com/electron/electron/blob/master/docs/api/remote.
我正在使用 Electron 在我的 Ionic React 应用程序上制作桌面版本。我已经决定闪屏只会在 React 应用程序说它可以消失时才会消失。 在 index.ts (主要的 Electro
嗨,我是从ipcRenderer.send()文件中调用index.html的。 我想做的是将函数调用延迟5秒。但是,它似乎不起作用。 这实际上是我想要做的:setTimeout(ipcRendere
这是情况。 可通过main.js中的nodejs(node-adodb)直接访问该数据库。我的Angular应用发送请求并从db.service接收sql结果。这部分工作正常,但是如果我有一个类似ge
我正在尝试将消息从模式发送回浏览器窗口,以便使用从模式返回的数据更新它。 模态有一个表格,当您点击一行时,行 ID 通过 ipcRenderer 消息发送,但消息似乎没有到达那里,因为控制台中没有记录
我正在用 Electron js 编写一个桌面应用程序,我想将数据从我的主进程发送到我的渲染器进程,反之亦然。为此,我使用 ipcMain和 ipcRenderer ,但很奇怪,同时能够通过我的渲染器
使用 Electron、React (es6/jsx)、sass、pouchdb 和 webpack 2 设置。我无法导入或需要 ipcRenderer 来使主进程和渲染器进程之间的通信成为可能。我的
我是一名优秀的程序员,十分优秀!