【发布时间】:2018-06-30 04:24:00
【问题描述】:
情况: 我刚开始学习对我的 JavaScript 代码进行单元测试,我想知道是否有办法伪造应用程序的行为以测试某些情况。我阅读了有关 sinon.js spy/stub/mock 的信息。然而,像往常一样 JS 有很多进一步的脚本和组合(即使用 mocha、chai、karma-jasmine),我希望有人能告诉我一个最佳实践。
举个例子: 如果我想在测试运行器中测试一个函数,它会根据窗口大小改变背景大小,那么触发不同的窗口大小(不是元素大小)以查看背景大小调整在多个工作中是很复杂的方面。
我已经测试了一些东西,例如
var resizeW = sinon.stub($.prototype, 'width').returns(600);
var resizeH = sinon.stub($.prototype, 'height').returns(1600);
// no effect - always takes the original view.height/width
viewport.setAttribute("content", "height=" + viewheight + "px, width=" + viewwidth + "px, initial-scale=1.0");
// new window is not testable in the root testrunner window
window.open + window.resizeTo() / window.resizeBy()
// shows no effect
window.innerHeight = '120'; window.innerWidth = '500';
// provides no possibility to assume different dimensions
$(window).trigger('resize');
// provides no possibility to assume different dimensions
$(document).trigger('resize');
// provides no possibility to assume different dimensions
window.dispatchEvent(new Event('resize'));
使用 iframe 会很乏味,即在原始 HTML 和测试运行 HTML 之间与 CSS 和 jQuery 发生冲突。
我希望有人可以提出一种方便的方法来实现这一点。
【问题讨论】:
-
这是一个使用窗口调整大小的坏例子,因为 CSS 媒体查询会为您处理所有这些计算。 IOE 不需要任何 JavaScript。
-
并非如此。让我们假设智能手机上的键盘在 textarea 点击时弹出并将整个内容缩小到剩余的窗口大小 - 这里你需要调整内容,这更容易用 js 处理。当您需要不断调整内容而不是逐步调整时,它也很出色......
-
你试过了吗:Selenium web driver seleniumhq.org or Headless Chrome chromium.googlesource.com/chromium/src/+/lkgr/headless/…
-
@jeff 在大多数情况下都是正确的,我想说,部分原因是 CSS 在不同的线程中处理这个问题,而不是对
resize事件的反应在同一线程中运行线程作为应用程序的其余部分,导致性能下降,通常很明显。
标签: javascript jquery unit-testing jasmine sinon