如何用摩卡/柴制作模拟窗口/文档
How to mock window/document with mocha/chai
当我尝试对getElement
功能进行单元测试时
class BarFoo {
getElement() {
return document.querySelector('#barfoo');
}
}
摩卡对document
一无所知,所以我想你可能会做这样的事情:
beforeEach(() => {
global.document = {
querySelector: () => { ... }
}
}
虽然这是有效的,但我想知道这是否是正确的方法,也许有一个包可以解决这个问题,因为如果使用更多的浏览器API,我的方法可能会变得费力?
有几个选项可供选择:
选项1:使用JSDOM
通过在代码中添加DOM,您可以在node.js 中对大部分客户端代码进行单元测试
选项2:在客户端上使用MOCHA
Mocha确实在客户端内部运行,您可以使用单独的客户端单元测试。这往往是我的首选方法,因为我可以针对特定的浏览器进行测试,而不是针对特定的JS植入。
选项3:使用PhantomJS
PhantomJS允许您在测试环境中控制无头浏览器
选项4:无头镀铬
现在Headless Chrome已经发布,PhantomJS的维护人员已经退休了。
我一直在编写类似于您提出的测试,当时我只需要模拟窗口上的某个函数:
it('html test', function () {
const windowRef = global.window;
global.window = {document: {querySelector: () => null}};
const lib = require('lib-that-uses-queryselector');
assert(true);
global.window = windowRef;
});
当我想要一个更完整的窗口对象时,我一直在其他测试中使用模拟浏览器:
it('html test', function () {
const windowRef = global.window;
const MockBrowser = require('mock-browser').mocks.MockBrowser;
global.window = new MockBrowser().getWindow();
const lib = require('lib-that-uses-window');
assert(true);
global.window = windowRef;
});
请注意,您可能希望在扰乱全局之后恢复窗口对象(上面的global.window = windowRef;
)。
相关文章:
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 防止Iframe窗体在新窗口中打开
- 在VanillaJS中模拟模型双向数据绑定
- 内部分区字体大小获胜'调整浏览器窗口大小时不会随媒体查询而更改
- 调整窗口大小时,可拖动的对象会出现在容器外部
- Javascript排序的图像弹出窗口..可以't单独弹出
- 如何使用jquery关闭模态窗口,通过模拟模态's关闭按钮
- 是否可以模拟 qUnit 测试的窗口位置对象
- 如何用摩卡/柴制作模拟窗口/文档
- 如何在 dojo 中模拟无模态窗口对话框,以便我们可以打开多个窗口窗格
- 在 chrome 中模拟 href 以打开新选项卡,而不是窗口.不使用点击
- 提交表单时模拟锚点行为(按下'ctl'时为新窗口)
- 如何使用jQuery/Javascript模拟单击在新选项卡/窗口中打开的链接
- JavaScript打开弹出窗口,模拟鼠标点击特定位置
- 如何在karma/mocha测试套件中模拟窗口对象属性
- 将网页上的模拟javascript终端窗口保持在固定位置
- microsoft metro-在windows javascript应用程序中模拟弹出窗口
- 可以在浏览器的对话框窗口中模拟单击事件
- 模拟方向更改,而无需调整浏览器窗口的大小
- 如何模拟“窗口”对象