1

私たちは Jasmine と RequireJS を単体テストにうまく組み合わせて使用​​してきましたが、現在はコード カバレッジの追加を検討しており、そのためにBlanket.jsを調査しています。名目上は Jasmine と RequireJS をサポートしていることはわかっており、GitHub で「jasmine-requirejs」ランナーを正常に使用できますが、このランナーはモデルとは少し異なるアプローチを使用しています。つまり、次を使用してテスト仕様をロードします。 runner.html のスクリプト タグ。一方、私たちのアプローチは、次のように RequireJS を介して仕様をロードすることでした (これは、ランナーでの requirejs 呼び出しのコールバックです)。

    var jasmineEnv = jasmine.getEnv();
    jasmineEnv.updateInterval = 1000;

    var htmlReporter = new jasmine.TrivialReporter();
    var jUnitReporter = new jasmine.JUnitXmlReporter('../JasmineTests/');

    jasmineEnv.addReporter(htmlReporter);
    jasmineEnv.addReporter(jUnitReporter);

    jasmineEnv.specFilter = function (spec) {
        return htmlReporter.specFilter(spec);
    };

    var specs = [];

    specs.push('spec/models/MyModel');
    specs.push('spec/views/MyModelView');

    $(function () {
        require(specs, function () {
            jasmineEnv.execute();
        });
    });

上記の関数の依存関係としてブランケットまたはジャスミンブランケットがない場合、このアプローチは単体テストを行うだけでうまく機能します。それらを (require.config パスと shim を使用して) 追加すると、それらが正常にフェッチされたことを確認できますが、発生しているように見えるのは、jasmine-blanket の オーバーロードを取得することだけですjasmine.getEnv().execute。これは単に「ブランケットを待っています... "コンソールに。テスト自体の実行をトリガーするものは何もありません。

私たちのアプローチでdata-coverは、RequireJS がスクリプト タグではなくスクリプトの読み込みを行っているため、通常の属性を提供する方法がないことはわかっていますが、この場合、Blanket は少なくとも何も計算しないのではなく、すべてのカバレッジを計算することを期待していました。カバレッジ パターンを指定する非属性ベースの方法はありますか? jasmine-blanket がミックスされたら、実際のテスト実行をトリガーするために他に何かする必要がありますか? テスト仕様をロードする RequireJS で Blanket を動作させることはできますか?

4

1 に答える 1

4

ブランケットジャスミンを要求してからオプションを設定することで、これが機能するようになりました

require.config({
    paths: {
        'jasmine': '...',
        'jasmine-html': '...',
        'blanket-jasmine': '...',
    },
    shim: {
        'jasmine': {
            exports: 'jasmine'
        },
        'jasmine-html': {
            exports: 'jasmine',
            deps: ['jasmine']
        },
        'blanket-jasmine': {
            exports: 'blanket',
            deps: ['jasmine']
        }
    }
});

require([
    'blanket-jasmine',
    'jasmine-html',
], function (blanket, jasmine) {
    blanket.options('filter', '...'); // data-cover-only
    blanket.options('branchTracking', true); // one of the data-cover-flags

    require(['myspec'], function() {
        var jasmineEnv = jasmine.getEnv();
        jasmineEnv.updateInterval = 250;
        var htmlReporter = new jasmine.HtmlReporter();

        jasmineEnv.addReporter(htmlReporter);
        jasmineEnv.specFilter = function (spec) {
            return htmlReporter.specFilter(spec);
        };
        jasmineEnv.addReporter(new jasmine.BlanketReporter());
        jasmineEnv.currentRunner().execute();
    });
});

重要な行は、BlanketReporter と currentRunner 実行の追加です。Blanket jasmine アダプターは jasmine.execute を、行をログに記録するだけの no-op でオーバーライドします。これは、コードを計測した後、開始する準備ができるまで実行を停止する必要があるためです。

通常、BlanketReport と currentRunner の実行はブランケット ジャスミン アダプターによって実行されますが、ブランケット ジャスミン自体を require でロードすると、ブランケット テスト ランナーを開始するためのイベントは、window.load イベントへのサブスクライブとして発生しません (ブランケットの時点で)。 -jasmine is loaded はすでに起動されています) したがって、レポートを追加して、通常はそれ自体が実行されるように「currentRunner」を実行する必要があります。

これはおそらくバグとして提起されるべきですが、今のところこの回避策はうまくいきます。

于 2013-10-18T16:02:00.317 に答える