convenient unit testing of browser-based javascript (no browser required)
JavaScript
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
test
.gitignore
LICENSE
README.md
constants.js
index.js
package.json

README.md

nodeunit-b

being a library for conveniently testing browser javascript with node

nodeunit-b provides a convenient interface around jsdom, bootstrapping front-end code with a DOM and allowing you to unit test it with nothing more than node and a few libraries (ie, no browser).

Example

    var b = require('nodeunit-b');

    // you'll want to use __dirname to pin root relative to your test file.
    // arguments to setRequireRoot are run through path.join.
    b.setInjectRoot(__dirname, '../../');

    // front-end dependencies to inject into the DOM.
    b.inject([
        // relative to where you set inject root
        // Note that these files will be checked for syntax errors.
        'jquery.js',
        'underscore.js',
        'lib_i_want_to_test.js' // provides, say, window.myLib
    ]);

    // wrap your test object
    exports.testAllTheThings = b({
        // make these properties of window conveniently available to tests
        provide: ['$', '_', 'myLib'],
        // html to bootstrap sandbox DOM with
        html: 'test.html',
        setUp: function(cb, w, b) {
            // w is a window object with a document attached
            // b is still b

            // mock out jquery.ajax
            w.$.ajax = function() { };
            cb();
        },
        tearDown: function(cb, w, b) [
            // another chance to mutate b, w
            // (though w will be reset in setUp)
            cb();
        },
        testThing: function(test, w, $, _, myLib) {
            $('<span/>').appendTo('body').addClass('foo');

            myLib.fooToBar();

            test.ok($('span').hasClass('bar'), 'we set the class');
            test.ok(!$('span').hasClass('foo'), 'and removed the old one');

            test.done();
        }
    });

Install

    npm install nodeunit-b

API

b

    exports.test_object = b(test_object);

The primary function. This produces a nodeunit test object that will provide a DOM to setUp, tearDown, and test functions (see above code example).

When wrapping a test object you may specify useful meta options:

     b({
        html: 'raw html or a filename',
        provide: ['prop0', 'prop1'],
        injects: ['filename0', 'filename1'],
        syntaxCheck: false

        setUp...
        test...
     });
  • html
    • sets html for DOM on a test-object basis.
  • provide

    • makes the given properties of window available to test functions. for example:

          provide: ['$', '_'],
          test_foo: function(test, w, $, _) { ... }
      
    • Be careful of masking, say, a nodejs underscore running in your tests with a window._ running in your front-end code.

  • injects
    • equivalent to a call to b.inject. unions with existing, test file level requires
  • syntaxCheck
    • verifies existence and syntactical correctness of all injected files.

setInjectRoot

    b.setInjectRoot('../');

Set the location to which front-end injects will be relative. For example, if your test resides in:

    /home/nate/src/proj/static/js/myLib/tests/test.js

and you want to reference dependencies in /home/nate/src/proj/static/js/, then:

    b.setRequireRoot('../../');

will set the require root to /home/nate/src/proj/static/js/.

inject

    b.inject(['jquery.js', 'underscore.js', 'myLib.js']);

or

    b.inject('myLib.js');

Inject a dependency into the DOM.

Changelog

4.0.0

  • standardize on meta options exclusively
  • require -> inject. terminology was confusing.

3.0.0

  • remove b.provide in favor of meta provide
  • proper error on local file-not-found
  • improve test suite
  • slightly change .html()'s behavior

2.1.0

  • meta options feature

2.0.0

  • provide feature
  • backwards compat brokenish, hence major version

1.1.0

  • syntax checking

1.0.1

  • slight improvement to setRequireRoot.
  • fluent interface
  • doc clarification

1.0.0

  • it works

Author

nathaniel k smith nathanielksmith@gmail.com

License

MIT