4

MVC.NET 4.0アプリケーションのプロトタイプを作成し、Javascriptテスト構成を定義しています。VS2012でChutzpah拡張機能を使用してJasmineを動作させることができ、純粋なJavascriptテストを正常に実行できます。

ただし、テストフィクスチャ(DOM)コードをロードして、テストからアクセスすることができません。

これが私が実行しようとしているコードです:

test.js

/// various reference paths...

jasmine.getFixtures().fixturesPath = "./";

describe("jasmine tests:", function () {
    it("Copies data correctly", function () {
        loadFixtures('testfixture.html');
        //setFixtures('<div id="wrapper"><div></div></div>');
        var widget = $("#wrapper");
        expect(widget).toExist();
    });
});

フィクスチャは、テストファイルと同じフォルダにあります。操作はsetFixtures機能しますが、ファイルからHTMLを読み込もうとすると、機能しません。最初は、リポジトリから最新バージョンのjasmine-jqueryを使用しようとしましたが、新しいバージョンにバグがあるように見えたため、1年以上前のダウンロードバージョン1.3.1にフォールバックしました。これが私が1.3.1で受け取るメッセージです:

テスト'jasminetests :: Copys datacorrectly'が失敗しましたエラー:フィクスチャをロードできませんでした:./testfixture.html(ステータス:エラー、メッセージ:未定義)file:/// C:/ Users / db66162 / SvnProjects / MvcPrototype / MvcPrototype.Tests / Scripts / jasmine / jasmine-jquery-1.3.1.js(103行目)

ソースを調べると、AJAX呼び出しが行われていますが、ブラウザーで実行されていません。代わりに、ヘッドレスブラウザ(PhantomJS)を実行するChutzpahを使用しています。これをブラウザでテストハーネスを使用して実行すると、機能します。

この問題の解決策を持っている人はいますか?Visual StudioとTeamCityの両方でこれらのテストを自動的に実行できるようにする必要があります(これがChutzpahを使用している理由です)。Chutzpahの代わりに別のテストランナーを使用することを含むソリューションを受け入れています。また、この取り組みでqUnitテストフレームワークを評価するので、qUnitの構成でこの問題が発生しないことがわかっている場合は、それが役立つと思います。

4

3 に答える 3

1

chutzpah.jsonに次の設定を追加することで問題を修正しました。

"TestHarnessLocationMode": "SettingsFileAdjacent",

chutzpah.jsonは私のテストアプリのルートにあります

于 2014-04-14T07:24:17.030 に答える
0

私はまったく同じ問題を抱えています。AFAIKは、テストがfile:// URIスキームを介して実行されるときに、jasmine-jqueryがAjaxを介してフィクスチャをロードしようとすることと関係があります。

どうやらChromeはこれを許可しておらず(https://stackoverflow.com/a/5469527/1904http://code.google.com/p/chromium/issues/detail?id=40787を参照)、他のブラウザ間でサポートしています異なる場合があります。

編集

などのPhantomJSコマンドラインオプションを設定してみると、楽しいかもしれませ--web-security=false。YMMV:私はまだこれを試していませんが、役立つ場合(または他の誰かがこのオプションとそれが役立つかどうかを知っている場合)に言及したいと思いました。

アップデート

Jasmine仕様の上部にコメントを追加することで、HTMLフィクスチャをロードすることに成功しました。/// <reference path="relative/path/to/fixtures" />しかし、JSONフィクスチャのロードにまだ問題があります。

さらなるアップデート

コメントを追加し/// <reference path="relative/path/to/fixtures" />てHTMLフィクスチャをロードすると、HTMLフィクスチャがJasmineテストランナーにロードされるだけであり、ニーズに適している場合とそうでない場合があります。フィクスチャを要素にロードしないjasmine-fixturesため、各テスト後にフィクスチャがクリーンアップされません。

于 2013-01-29T10:55:42.047 に答える
0

最終的に問題は解決しました。返信してくれてありがとうイアン。TeamCityでPhantomJSを使用して、テストランナーを介してテストを実行できます。Chutzpahの作成者に連絡したところ、彼はVisualStudioでの私の問題を解決する更新プログラムを彼の製品に展開しました。これで、Chutzpah規則を使用してJasmineテストを実行し、VSでライブラリを参照してフィクスチャを含め、TeamCityのPhantomJSランナーを使用してテストランナー(html)を使用できるようになりました。

TeamCityでの私の解決策は、テストを起動するバッチファイルを実行することでした。したがって、バッチ:

@echo off
REM -- Uses the PhantomJS headless browser packaged with Chutzpah to run 
REM -- Jasmine tests.  Does not use Chutzpah.
setlocal
set path=..\packages\Chutzpah.2.2.1\tools;%path%;
echo ##teamcity[message text='Starting Jasmine Tests']
phantomjs.exe phantom.run.js %1
echo ##teamcity[message text='Finished Jasmine Tests']

そしてJavascript(phantom.run.js):

// This code lifted from https://gist.github.com/3497509.
// It takes the test harness HTML file URL as the parameter.  It launches PhantomJS,
// and waits a specific amount of time before exit.  Tests must complete before that 
// timer ends.  
(function () {
    "use strict";
    var system = require("system");
    var url = system.args[1];

    phantom.viewportSize = {width: 800, height: 600};

    console.log("Opening " + url);

    var page = new WebPage();

    // This is required because PhantomJS sandboxes the website and it does not
    // show up the console messages form that page by default
    page.onConsoleMessage = function (msg) {
        console.log(msg);

        // Exit as soon as the last test finishes.
        if (msg && msg.indexOf("Dixi.") !== -1) {
            phantom.exit();
        }
    };

    page.open(url, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
            phantom.exit(-1);
        } else {
            // Timeout - kill PhantomJS if still not done after 2 minutes.
            window.setTimeout(function () {
                phantom.exit();
            }, 10 * 1000); // NB: use accurately, tune up referring to your needs
        }
    });
}());
于 2013-04-22T22:46:27.893 に答える