Mocha + RequireJS = AMD测试

Osk*_*ura 14 javascript mocha.js node.js requirejs js-amd

我很难将Mocha连接到基于RequireJS的应用程序,可能是你能够想出一些东西:).经过几个小时,我一直在尝试加载AMD模块,只是在console.log中发送了一些模板已经加载的"信息"...没有发生任何事情 - 程序刚刚结束并打印出一些摩卡信息.

var facade = requirejs(['../../public/js/scripts/widgets/widgets/article/main.js'],      
    function(mod) {
        console.log('fired')
});
// run with: $ mocha -u tdd test.js --reporter spec
Run Code Online (Sandbox Code Playgroud)

而且我想出了解决回调问题的想法:

setTimeout((function() {
    console.log('fired');
}), 5000);
// run with: $ mocha -u tdd test.js --reporter spec
Run Code Online (Sandbox Code Playgroud)

也没用.所以最后我和两个人一起跑

$ node test.js 
Run Code Online (Sandbox Code Playgroud)

最后它奏效了.所以问题是:如何使用回调处理来运行Mocha测试,因为这些对于AMD测试至关重要?

Lou*_*uis 25

你这样做的方式,mocha不会对你的文件做任何事情,因为它没有看到它的测试套件.RequireJS计划调用回调,但是在有机会发生之前,mocha会退出.与您的超时示例相同.

以下为您举个例子.

档案test.js:

'use strict';
var requirejs = require("requirejs");
requirejs.config({
    baseUrl: '.',
    nodeRequire: require
});

suite('Something', function(){
    var foo;

    suiteSetup(function (done){
        // This saves the module foo for use in tests. You have to use
        // the done callback because this is asynchronous.
        requirejs(['foo'],
                  function(mod) {
            console.log("fired!");
            foo = mod;
            done();
        });
    });

  suite('blah', function(){
    test('blah', function(){
      if (foo.test !==  "test")
          throw new Error("failed!");
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

档案foo.js:

define(function () {
   return {test: "test"};
});
Run Code Online (Sandbox Code Playgroud)

当你运行:

mocha -u tdd test.js
Run Code Online (Sandbox Code Playgroud)

您将看到回调被触发并且测试通过.

对于读书人这个问题上的利益,通过混淆使用suite,suiteSetup,test...摩卡支持多种接口.代码在这里是使用TDD界面(OP调用摩卡用-u tdd),其中出口suite,suiteSetup,test等.在默认的BDD接口,所述等同物describe,beforeit分别.