gpt4 book ai didi

node.js - 如何使用 jasmine-node 对非模块进行单元测试? (与关闭 Electron 中的 Node 集成有关)

转载 作者:行者123 更新时间:2023-12-03 12:38:06 25 4
gpt4 key购买 nike

我有点进退两难。
我打开了contextIsolation并关闭nodeIntegration对于我的BrowserWindow并加载了一个本地 html 页面。 (正如 Electron 推荐的那样)。
这个本地 html 页面需要一个 node 模块,这会导致崩溃,因为 Electron 无法在窗口中加载 node 模块,因为 node 被禁用:
main.ts:

import { app, BrowserWindow } from "electron";
import * as path from "path";

function createWindow() {
const mainWindow = new BrowserWindow({
webPreferences: {
nodeIntegration: false,
contextIsolation: true,
preload: path.join(__dirname, "preload.js"),
},
});

mainWindow.loadFile(path.join(__dirname, "../index.html"));
mainWindow.webContents.openDevTools();
}

(async () => {
await app.whenReady();
createWindow();
})();

app.on("window-all-closed", () => {
if (process.platform !== "darwin") {
app.quit();
}
});
索引.html:
<body>
<h1>Hello World!</h1>
<script src="./renderer.js"></script>
</body>
渲染器.js:
export interface A { }

Uncaught ReferenceError: exports is not definedat renderer.js:2


崩溃的具体行是这样的: Object.defineProperty(exports, "__esModule", { value: true });由于 export 而存在陈述。
在这种情况下,我可以删除导出(并且只需在需要它的其他模块中重新定义接口(interface)),但是我无法对我的脚本进行单元测试。
我目前正在使用 jasmine-node 对于单元测试,我一直需要我想在顶部测试的模块:
import * as Renderer from "./renderer"
这在 VSCode 中出现了一些关于如何 Renderer 的错误。不是一个模块。
似乎需要工作(我猜 Node 可以 require 非模块?),但这会导致 IIFE 在我的 spy 设置​​之前运行。
如果 Renderer是一个模块,我会这样做:
<script>
require("renderer.js").main();
</script>
然后我的单元测试会在调用 main 方法之前在模块上设置 spy 。但是因为我不能 require在我的 index.html 中,因为我禁用了 Node,我必须内联加载脚本,所以我需要某种 IIFE 来替换 main 方法:
(async () => {
await doSomething();
})();
然后如何使用 Jasmine 对这个非模块进行单元测试?

最佳答案

我的解决方案最终变得很糟糕。
首先,我必须使我的非模块成为一个模块,以便我可以在我的规范中导入它。
我导出了我的界面并添加了一个 main 方法:

export interface A { }
export async function main(): Promise<void> {
await doSomething();
}
为了避免我之前在禁用 Node 的情况下加载脚本时遇到的崩溃,我在我的 html 页面中添加了这个 hack:
<script>var exports = {};</script> // mutes the "exports not defined" error
<script src="./renderer.js"></script>
然后,如果 jasmine 没有运行,我让我的 IIFE 调用我的主要方法。
(async () => {
if (!window.jasmine) {
main();
}
})();
我的单元测试同时设置了 spy 并调用导出的 main 方法。

关于node.js - 如何使用 jasmine-node 对非模块进行单元测试? (与关闭 Electron 中的 Node 集成有关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65568182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com