3

プロキシを使用してローカル json ファイルにアクセスする基本的な EXT JS ストアがあります。

例えば

...
proxy: {
    type: 'ajax',
    api: {
        read: 'data/mydata.json'
    },
    reader: {
        type: 'json',
        root: 'datas',
        successProperty: 'success'
    }
} 
...

Maven、Jasmine、および PhantomJS を使用して、Atlassian Bamboo (私の CI サーバー) でプロジェクトをビルドおよびテストしたいと考えています。

PhantomJS をローカルで実行すると、次のようになります。

$ phantomjs "c:\phantomjs-1.6.1\examples\run-jasmine.js" run-tests.html

次の出力が得られます。

'waitFor()' finished in 422ms.
 4 specs, 2 failures in 0.075s

これは、PhantomJS がEXT JS プロキシのfile://プロトコルを使用してローカル ファイルを読み込めないために発生します。

私はこの例に従っていますが、Apache のような Web サーバーでプロジェクトをホストするのではなく、テスト html ファイルで PhantomJS をローカル (Bamboo サーバー上) で使用できるように、プロキシの応答をモックすることが可能かどうか疑問に思っています。 (Mavenで管理する必要がある外部依存関係)。

そうでない場合、これを達成するために使用できる他のメカニズム (Jasmine、PhantomJS、またはその他に組み込まれている) はありますか?

4

3 に答える 3

9

ファイルシステムからロードする場合、PhantomJS で XHR を実行することは実際に可能です!

PhantomJs wikiから直接:

--web-security=[yes|no] disables web security and allows cross-domain XHR (default is yes)

また、このトピックに光を当てる可能性のあるPhantomJs のこの問題レポートも参照してください。

Sencha の 'sencha create jsb' コマンドは PhantomJs (および Ext.Loader は XHR を使用) を使用し、ファイル システムからのロードをサポートします。

name: 'app-entry',
alias: 'a',
description: 'The file or URL path to your application\'s HTML entry point',

チェックアウト[senchasdktools]/compat/command/src/modules/GenerateJSB.js[senchasdktools]/compat/command/scripts/phantomjs-jsb.js.

web-securityただし、前述のスイッチに関連するものは何も表示されません。おそらく彼らはカスタムのphantomJsビルドを使用しています。

UPDATE このコード フラグメントは、ファイル システムへの XHR リクエストを許可します。phantomJs の最新バージョン (1.6.1/Windows) でテスト済み:

var page = new WebPage();
page.settings.localToRemoteUrlAccessEnabled = true;

UPDATE2 これは実用的な例です。

すべてを同じフォルダーに入れ、test.txtコンテンツを含むファイルを追加してから実行します

phantomjs script.js test.html

phantomjs スクリプト (script.js):

var fs = require('fs');

var appLocation = phantom.args[0];

var page = new WebPage();

page.settings.localToRemoteUrlAccessEnabled = true;
page.settings.ignoreSslErrors = true;

page.onConsoleMessage = function(message, url, lineNumber) {
    console.log((url ? url + " " : "") + (lineNumber ? lineNumber + ": " : "") + message);
};

page.onError = function (msg, trace) {
    console.log(msg);
    trace.forEach(function(item) {
        console.log('  ', item.file, ':', item.line);
    });
    phantom.exit(1);
};

if (!/^file:\/\/|http(s?):\/\//.test(appLocation)) {
    appLocation = 'file:///' + fs.absolute(appLocation).replace(/\\/g, '/');
}

page.open(appLocation, function(status) {
    if (status !== 'success') {
        error("Failed opening: '" + appLocation + "'. Please verify that the URI is valid");
    }

    page.evaluate(function() {
        window.onerror = function(message, url, lineNumber) {
            console.log((url ? url + " " : "") + (lineNumber ? lineNumber + ": " : "") + message);
        };

    });

    timer = setInterval(function() {
        console.log('Timeout!');
        phantom.exit(1);
    }, 2000);
});

HTML ファイル (test.html):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html class="x-border-box x-strict">
<head>
    <title>Test</title>
    <script type="text/javascript">
    var xhr = new XMLHttpRequest();

    try {
        xhr.open('GET', 'test.txt', false);
        xhr.send(null);
    } catch (e) {
        console.log('cross origin?');
    }

    console.log('status', xhr.status);
    console.log('response', xhr.responseText);

    </script>
</head>
<body class="x-body">
</body>
</html>

Chrome と --disable-web-security と ExtJs

私は実際--disable-web-securityに Google Chrome の起動パラメータとして使用して、開発中にファイルシステムから webapp を実行していますが、そこで動作します (Chrome の起動時に他の Chrome プロセスを実行する必要はありません)。Chrome は、サポートされていないオプションを使用していることを示す警告メッセージを表示します (上部の黄色の通知バー)。

ただし、Ext がこのようなセットアップで動作するには、2 つの問題を修正するために Ext.Connection に追加のパッチが必要でした: (1)0ファイル システム リソースをロードするときは常に xhr.status です。Ext は、このステータス コードを とは見なしませんsuccessful。Ext が PhantomJs で実行されているときにこれを処理する専用のコードがあります。そのため、そこで動作するはずです。

(2) URL にクエリ文字列が含まれている場合、Chrome はファイル システム リソースの読み込みに失敗しました。ファイルシステム モードでは、Connection クラスをオーバーライドして、すべての URL パラメータを取り除きます。

于 2012-08-23T05:14:05.817 に答える
4

つまり、ブラウザ、および WebKit、制限 (セキュリティ) であり、独自の Web サーバーを実行している場合を除き、バイパスする方法はありません。nodejs には簡単な方法があります。ローカル マシンのポートでサーバーを実行するには、数行のコードが必要です。

以下のように server.js を作成し、phantomjs を実行するnode server.js前にそれを実行するだけです。

var http = require('http');
var fs=require('fs');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end(fs.readFileSync(__dirname + req.url, 'utf8')); 
}).listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3000/');

このファイルをプロジェクト ルートまたは更新行に保持する

res.end(fs.readFileSync(__dirname + req.url, 'utf8')); 

__dirname は、server.js が存在するフォルダーのパスであり、ノード プロセスによって設定されます....

これで、data/*.json を保持したり、ノードでモック データを作成したりできます ;)

===更新====

PhantomJS のドキュメントを読んだ後、nodejs なしで上記と同じことができることがわかりました。どうやら、PhanotmJS には上記のモジュールがすべて含まれているようです

確認することを検討してください:

そして、あなたは行ってもいいでしょう。

于 2012-08-17T02:18:25.900 に答える
1

Karma テスト ランナー/Jasmine 1.x および 2.0 バージョンを使用した単体テスト用の ExtJS 4 を処理するための 2 つのリポジトリを作成し、非同期の問題を処理します。 github.com/cgauthier/karma_jasmine_2_extjs4 .

于 2014-07-22T17:00:56.333 に答える