4

我对 RequireJS 很陌生,并且在将 QUnit 写入具有使用 requireJS 动态加载模块的逻辑的源代码时遇到了麻烦。

以下是源代码:factory/Factory.js *

getPage: function (callback) {

    //doSomething here

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

         callback();

    })
}

运行 QUnit 时永远不会加载模块“page/something”,并且永远不会调用回调。我在这里有什么遗漏吗?感谢您的回复。

* *QUnit 工厂/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){

    })

});

测试套件.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,onLoad 在大多数 js 文件加载之前触发。

于 2013-01-06T20:36:50.327 回答
2

我今天已经解决了这个问题,并将收集到的信息添加到@keithjgrant 正确答案中。

来自RequireJs 文档

QUnit

尽管 QUnit 在作为异步模块加载时存在问题,但您可以通过在 require.js 之前将其包含在脚本标记中,然后关闭自动启动,然后在加载带有测试的模块后手动调用 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 的代码时,似乎窗口加载事件已经被调度。document.readyState因为load 事件的'complete'addEventHandler 的行为不像 Promise,所以将处理程序添加到已触发的事件不会触发处理程序。

显式调用该QUnit.load函数,解决了我的问题。需要考虑如何在该调用点找到窗口是否已完成加载。您可以使用 JQquery 或使用我从中获取的部分 JQuery 代码document.readyState == 'complete'来执行此操作。

于 2014-06-20T15:27:32.860 回答
0

你可以这样做:

    <!DOCTYPE html>
<html>
<head>
    <title>Example Test Runner</title>
    <link rel="stylesheet" href="//code.jquery.com/qunit/qunit-1.15.0.css">
    <script src="../libraries/qunit/qunit/qunit.js" data-main="testsuite.js"></script>
    <script>
        QUnit.config.autostart = false;
    </script>
    <!-- Load RequireJS & the testsuite -->
    <script src="../libraries/requirejs/require.js" data-main="testsuite.js"></script>
</head>
<body>
<div id="qunit"></div>
</body>
</html>

所以 requirejs 将在设置 QUnit 选项后开始工作。

于 2014-11-16T20:06:28.287 回答