我一直在尝试创建一系列功能单元测试,使用PhantomJS作为浏览器在Node.js Web服务器上运行,在另一个站点上测试功能。我过去使用FuncUnit成功运行目标站点本身的功能测试,但为了测试规模,我创建了一个Node项目,在Heroku实例上运行。
我用Bower来安装JQuery,Jasmine(我正在使用的测试运行器)和FuncUnit。我被告知FuncUnit不支持最新版本的Jasmine,因此版本为1.3.1 - 所有其他软件包都是最新版本。 Phantom已随NPM一起安装,并打开以下页面:
<html>
<head>
<title>Functional Testing</title>
<script type="text/javascript" src="bower_components/jquery/dist/jquery.js"></script>
<script type="text/javascript" src="bower_components/syn/dist/syn.js"></script>
<script type="text/javascript" src="bower_components/jasmine-core/lib/jasmine-core/jasmine.js"></script>
<script type="text/javascript" src="bower_components/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
<script type="text/javascript" src="bower_components/jasmine-core/lib/jasmine-core/json2.js"></script>
<script type="text/javascript" src="bower_components/funcunit/dist/funcunit.js"></script>
<script type="text/javascript" src="testSpec.js"></script>
<script type="text/javascript">
// Standard Jasmine 1.3 boot script from examples
</script>
</head>
<body>
</body>
</html>
一旦测试运行开始,我几乎立即遇到错误。下面的部分似乎会导致崩溃,但我很难确定哪条线与堆栈轨迹难以导航完全一致。
F.attach(jasmine);
F.speed = 100;
describe("Demo Script", function() {
"use strict";
it("should login to the website", function() {
F.open("http://example.site/login");
if (F('h2:contains("ALL PROJECTS")').size() === 0) {
// Not logged in
F('#Email').visible().type("a@b.com");
}
});
});
这会产生错误,其描述如下:
TypeError: 'undefined' is not an object (evaluating 'off.left')
file:///app/bower_components/funcunit/dist/funcunit.js:290
file:///app/bower_components/funcunit/dist/funcunit.js:473
file:///app/bower_components/funcunit/dist/funcunit.js:120
file:///app/bower_components/funcunit/dist/funcunit.js:91
file:///app/bower_components/funcunit/dist/funcunit.js:2852
file:///app/bower_components/funcunit/dist/funcunit.js:3240
此堆栈跟踪的顶行指向以下函数:
//syn.helpers.addOffset
addOffset: function (options, el) {
var jq = syn.jquery(el), off;
if (typeof options === 'object' && options.clientX === undefined && options.clientY === undefined && options.pageX === undefined && options.pageY === undefined && jq) {
el = jq(el);
off = el.offset();
options.pageX = off.left + el.width() / 2;
options.pageY = off.top + el.height() / 2;
}
}
似乎el
作为undefined
传递给此函数,但尝试调查此调用的来源让我感到难过。如果任何人都可以看到丢失的脚本引用或我的测试规范可能导致此问题的任何错误,那么我们将非常感激。谢谢!
我刚刚注意到,如果我让它继续运行,这个错误每隔30秒就会重新发生一次。