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 秒ごとに再発することに気付きました。