Mocha + RequireJS = AMD testing

javascript, js-amd, mocha.js, node.js, requirejs

Solution

The way you are doing it, mocha is not going to do anything with your file because it does not see a test suite in it. RequireJS is scheduled to call the callback but mocha exits before this has a chance to happen. Same with your timeout example.

The following gives you an example.

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

File `foo.js`:

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

When you run:

mocha -u tdd test.js

You'll see that the callback is fired and the test passes.

For the benefit of people reading this question and confused by the use of `suite`, `suiteSetup`, `test`... Mocha supports multiple interfaces. The code here is using the TDD interface (the OP invokes Mocha with `-u tdd`), which exports `suite`, `suiteSetup`, `test`, etc. In the default BDD interface, the equivalents are `describe`, `before` and `it`, respectively.

Problem

I have a hard time connecting Mocha to RequireJS based application, may be You'll be able to come up with something :). After many hours when I've been trying to load AMD modules and simply console.log some 'fired' info that the module has been loaded... nothing happend had happened - the program just ended and printed out some mocha info. ``` 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 ``` and than I've come up with the idea to fire just this to test callbacks: ``` setTimeout((function() { console.log('fired'); }), 5000); // run with: $ mocha -u tdd test.js --reporter spec ``` also didn't work. So finally I've run both with ``` $ node test.js ``` and finally it worked. So question is than: How to run Mocha test with callbacks handling, as those are essential for AMD testing?

Original source