Mocha + RequireJS = AMD 测试

14

我很难将Mocha连接到基于RequireJS的应用程序中,也许你能想出一些办法 : )。在尝试加载AMD模块并简单地console.log一些已加载的“fired”信息时,经过许多小时后... 什么都没有发生 - 程序只是结束并打印出一些mocha信息。

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

然后我想到了一个测试回调函数的想法,就是只解雇这个人:

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

也没有起作用。最后我同时运行了两个。

$ node test.js 

最终它成功了。所以问题是:如何使用回调函数处理运行Mocha测试,因为这对于AMD测试至关重要?

2个回答

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!");
    });
  });
});

文件foo.js

define(function () {
   return {test: "test"};
});

当您运行:

mocha -u tdd test.js

你会看到回调被触发并且测试通过。

为了方便阅读本问题的人,对于使用 suitesuiteSetuptest 时感到困惑的人... Mocha 支持多种接口。此处的代码使用 TDD 接口( OP 使用 -u tdd 调用 Mocha),该接口导出了 suitesuiteSetuptest 等。在默认的 BDD 接口中,分别对应 describebefore it


不仅仅是“完成”,请看我添加到答案开头的段落。Mocha在文件中没有看到测试套件,立即退出。 - Louis

4
我已经为在RequireJS环境中使用mocha配置了相关的样板文件。它可能不是你想要的精确内容,但它可能会有所帮助。 https://github.com/x2es/boilerplate-karma-mocha-chai-requirejs 另外需要注意的一点是,如果你的脚本放在“/public”目录下,那么最好在浏览器环境而不是nodejs中进行测试。为此,你应该查看一些测试运行程序,如JsTestDriver (https://code.google.com/p/js-test-driver/)或karma-runner (http://karma-runner.github.io/)。或者其他...。
在karma文档提供的片段中(http://karma-runner.github.io/0.8/plus/RequireJS.html)。
var tests = [];
for (var file in window.__karma__.files) {
  if (window.__karma__.files.hasOwnProperty(file)) {
    if (/Spec\.js$/.test(file)) {
      tests.push(file);
    }
  }
}

requirejs.config({
    // Karma serves files from '/base'
    baseUrl: '/base/src',

    paths: {
        'jquery': '../lib/jquery',
        'underscore': '../lib/underscore',
    },

    shim: {
        'underscore': {
            exports: '_'
        }
    },

    // ask Require.js to load these files (all our tests)
    deps: tests,

    // start test run, once Require.js is done
    callback: window.__karma__.start
});

当我们强制使用requirejs预加载所有必要的规范文件时,引入的方法如下:

require.config({
  deps: ['array', 'of', 'our', 'spec', 'files']
})

在这种环境下,每个规范文件都应该是一个常规的RequireJS模块。
以下是适用于此类环境的测试规范示例:
define(['chai'], function(chai) {
  var expect = chai.expect;

  describe('bootstrap', function() {
    it('should...', function() {
      expect('a').to.equal('a');
    });
  });
});

我认为这个解决方案也可以,但它使用了“chai”,而我现在想暂时不使用“promises”来处理它。但是非常感谢您的努力 :)。 - Oskar Szura

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接