4

私は RequireJS にかなり慣れていないので、requireJS を使用して動的にモジュールをロードするロジックを持つソース コードに QUnit を書き込むのに問題があります。

以下はソースコードです: factory/Factory.js *

getPage: function (callback) {

    //doSomething here

    require(['page/something'], function() {

         callback();

    })
}

QUnit の実行中にモジュール 'page/something' がロードされることはなく、コールバックが呼び出されることもありません。ここに欠けているものはありますか?あなたの応答に感謝します。

* *QUnit factory/FactoryTests.js*

define(['underscore', 'factory/Factory'],
       function (_, Factory) {

           module("Factory", {
               setup:function () {
               },
               teardown:function () {
               }
           });

           test("GetPage", function () {
              var isCallbackInvoked = false;
              var mockCallback = function () {
                  isCallbackInvoked = true;
              }

              Factory.getPage(mockCallback);
              ok(isCallbackInvoked);

           });

});

* test-require-config.js **

require.config({

    baseUrl: "../../resources/js",

    paths:{
        jquery:'../jquery-1.8.2',
    jquery_star_rating : '../jquery/jquery.rating',
        underscore:'..underscore-1.4.1',
        backbone:'../backbone-0.9.2',
        jquery_star_rating : '../jquery.rating',
        text : '../require-text-2.0.3',
        sinon: '../../../../sinon',
    },
    shim:{
        underscore:{
            exports:'_'
        },
        backbone:{
            deps:["jquery", "underscore"],
            exports:"Backbone"
        }
        jquery_star_rating : {
            deps : ['jquery']
        }
    }

});

var dependencies = [
    'jquery',
    'jquery_star_rating',
    'underscore',
    'backbone',       
    'sinon',
];

require(dependencies, function () {

    require(['../../../../test/js/testsuite'], function(suite){

    })

});

testsuite.js

function () {

    QUnit.config.autostart = false;

    var testModules = [       
        "factory/FactoryTests.js"
    ];

    require(testModules, QUnit.start);
}());

ありがとう!!

4

3 に答える 3

6

まず、明確化: QUnit テスト ページはどのように見えますか? ゼロのテストをリストしているか、空白のページであると思います。

だとしたら、私も同じことでかなり苦労しました。「正しい」答えはまさにあなたがしていることです。しかし、多くのコードをステップ実行した後、私のセットアップでは、設定にもかかわらず、テストが定義される前に QUnit がまだ開始されていQUnit.config.autostart = falseました。

testsuite.js の最後で、QUnit.load()代わりに呼び出してみてくださいQUnit.start()(おそらくautostart = false, も削除できます)。これは文書化されていない機能ですが、私にとっては機能した唯一のものでした。QUnit がデフォルトで onLoad イベントにアタッチする機能だと思います。残念ながら、RequireJS では、ほとんどの js ファイルがロードされる前に onLoad がトリガーされます。

于 2013-01-06T20:36:50.327 に答える
2

私は今日この問題に取り組み、収集した情報を@keithjgrantの正解に追加しています。

RequireJs ドキュメントから:

Qユニット

QUnit が非同期モジュールとして読み込まれると問題が発生しますが、require.js の前にスクリプト タグに含め、autostart をオフにし、テストを含むモジュールが読み込まれたら手動で start() を呼び出すことで動作させることができます。ただし、start はタイマー内から呼び出す必要があります。フルハーネスはこちら。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>QUnit Test Suite</title>
    <link rel="stylesheet" href="qunit-git.css">
    <script data-main="main" type="text/javascript" src="libs/require.js"></script>
    <script src="libs/qunit-git.js"></script>
    <script type="text/javascript">
        window.addEventListener("load", function onLoad() {
            QUnit.config.autostart = false;
                        // Without this setTimeout, the specs don't always get execute in webKit browsers

            setTimeout(function () {
                                //load tests using require
                require(['firstUse/example_test'], function (one) {
                    //now trigger them.
                    QUnit.start();
                });

            }, 10);
            window.removeEventListener("load", onLoad, true);
        }, true);
    </script>
</head>
<body>
    <div id="qunit">
    </div>
</body>
</html>

テストを停止する必要がある場合は Qunit.stop() を使用し、さらに非同期作業を行ってから、QUnit.start() でテストを再開します。

QUnitソースコードより

Unit.load = function() {
  ...

  if ( config.autostart ) {
    QUnit.start();
  }
};

if ( defined.document ) {
   addEvent( window, "load", QUnit.load );
}

RequireJs で QUnit を呼び出す別のアプローチが機能しない理由を調査しました。@keithjgrant が提案したのと同じ解決策を見つけました。

RequireJs から QUnit を呼び出したコードをデバッグしているときに、ウィンドウ ロード イベントが既にディスパッチされているようです。load イベントのaddEventHandlerdocument.readyState'complete'promise のように動作しないため、既に発生したイベントにハンドラーを追加しても、ハンドラーはトリガーされません。

QUnit.load関数を明示的に呼び出すと、問題が解決しました。ウィンドウの読み込みが完了したかどうかをその呼び出しポイントで見つける方法を検討する必要があります。これは、JQquery を使用するか、元の JQuery コードの一部を使用して行うことができますdocument.readyState == 'complete'

于 2014-06-20T15:27:32.860 に答える