gpt4 book ai didi

typescript - 窥探 electron.BrowserWindow 构造函数并返回一个带有 Jasmine 的模拟对象

转载 作者:行者123 更新时间:2023-12-03 12:43:21 28 4
gpt4 key购买 nike

我已经看到这个网站上还有其他一些关于如何监视构造函数的帖子。我明白我应该覆盖外部库原型(prototype)中的构造函数。这就像从外部库中监视函数一样,例如:

import * as cp from 'child_process';

spyOn(cp, 'spawn').and.returnValue(...);

但是在我的具体情况下,我似乎无法将此答案映射到我的问题,因为似乎没有 constructorinit我要模拟的类型的原型(prototype)中的方法。

我正在使用 jasmine 对 Electron 应用程序进行一些单元测试。想象一下要测试的方法包含以下代码:
public methodToTest() {
this.firstWindow = new BrowserWindow(...);
// hide is called, or for that matter any other method that I want to spy upon
this.firstWindow.hide();
}

在测试中我想检查 BrowserWindow上的具体方法是否已被调用(在此示例中为 hide)。

我通过以下方式设置测试:
import * as electron from 'electron';

// ...

beforeEach(() => {

browserWindowSpy = createSpyObj('browser', [ 'on', 'hide', 'show']);

// there is no constructor or init method on the prototype
spyOn(electron.BrowserWindow.prototype, 'constructor').and.returnValue(browserWindowSpy);

underTest = new Application();
});
electron.d.ts 中有一个构造函数文件,如果我查看类型定义,但我不知道如何引用它。

引用 browserWindowSpy然后我可以在测试中使用它来测试一些期望。在这种情况下模拟的方法是什么,其中类型来自外部库并且不是函数但必须使用 new 实例化关键词。我在这种情况下苦苦挣扎,或者现在已经有一段时间了。

PS:我确实有一个解决方法,但我认为它很丑陋,需要更好的建议:) 我对 BrowserWindow 使用创建者方法在类内部并监视它以返回假浏览器(您不应模拟被测类的方法):

protected createBrowserWindow(options?: any): BrowserWindow{
return new BrowserWindow(options);
}

public methodToTest() {
this.firstWindow = this.createBrowserWindow(...);
// hide is called, or for that matter any other method that I want to spy upon
this.firstWindow.hide();
}

并在测试中:
beforeEach(() => {
browserWindowSpy = createSpyObj('browser', [ 'on', 'hide', 'show']);
underTest = new Application();
spyOn(underTest, 'createBrowserWindow').and.returnValue(browserWindowSpy);
});

最佳答案

您可以使用 mockery 在 Node.js 中模拟对象。

import * as mockery from "mockery";

然后,创建一个假的 BrowserWindow对象,您可以在 beforeEach 中执行此操作:
const fakeBrowserWindow = jasmine.createSpyObj("browser", ["hide"]);
const fakeBrowserWindowCtr = jasmine.createSpy("BWCtr").and.returnValue(fakeBrowserWindow);

mockery.enable();
mockery.registerMock("electron", { BrowserWindow: fakeBrowserWindowCtr });

在您的 afterEach做:
mockery.deregisterAll();
mockery.disable();

然后,每当您的代码需要 Electron 时,如下所示:
const { BrowserWindow } = require("electron");

它会返回假的 BrowserWindow .

对此的一个警告是,如果您在设置模拟之前加载您正在测试的脚本,您将使用原始对象,而不是模拟。

所以要么延迟导入脚本,直到你调用了 mockery.registerMock ,或者做你的 electron需要在功能级别,而不是模块级别。

关于typescript - 窥探 electron.BrowserWindow 构造函数并返回一个带有 Jasmine 的模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57203853/

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