Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@mathieul
Created May 11, 2011 16:12
Show Gist options
  • Star 10 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mathieul/966776 to your computer and use it in GitHub Desktop.
Save mathieul/966776 to your computer and use it in GitHub Desktop.
Require files using RequireJS before running Jasmine specs
/*
* jasmine.requirejs() returns a function that will load the file(s) required
* and will wait until it's done before proceeding with running specs.
* The function returned is intended to be passed to beforeEach() so the file(s)
* is(are) loaded before running each spec.
*
* Syntax:
*
* jasmine.requirejs(options, files)
* or
* jasmine.requirejs(files)
*
* Where:
* - options is a configuration object like the one you
* can bass to RequireJS require() function (i.e.: baseUrl, paths, etc...)
* and
* - files is an array of files to require (i.e.: ['lib/common', 'views/main'])
*
* Example:
*
* beforeEach(jasmine.requirejs({
* baseUrl: '/public/javascripts'
* }, [
* 'lib/app.help-mgr'
* ]));
*/
jasmine.requirejs = function () {
var params = Array.prototype.slice.call(arguments),
isLoaded = false,
files;
files = arguments[0].length ? arguments[0] : arguments[1];
files = files.join(', ');
return function () {
require.apply(null, params.concat(function () {
isLoaded = true;
}));
waitsFor(function () {
return isLoaded;
}, 'file(s) to be required/loaded: ' + files);
};
};
@nicogranelli
Copy link

But how do you get a handle for the module required?

@mathieul
Copy link
Author

It was not a requirement of the project I wrote this for. All the files included would export their public interface into the application global (window.APP).

@nicogranelli
Copy link

This "export their public interface into the application global (window.APP)" is the regular way of work of requireJS? o do you have to do something special when you creates the module definitions? I new to requireJS, and your comment really lost me :)

@mathieul
Copy link
Author

I don't know the best practices in using require.js. I understand it is possible to have your modules export their public API/objects, so when you include them using require() or define() you can actually use the handles that are passed as parameters to those functions. What I was saying is that for our project, instead of doing that, each file would store on a global object whatever they wanted to expose.

So this snippet doesn't allow you to pass module handles to your jasmine specs. Instead it expects the jasmine specs to test the module through their public API in the global object.

For instance if we test a backbone model Post, in post.js, we would have something like:

define([
    'vendor/jquery.min.js',
    'vendor/underscore.min.js',
    'vendor/backbone.min.js'
], function () {
    var Post = Backbone.Model.extend({
        ...
    });
    window.APP.Models.Post = Post;
});

and we would test it like so:

describe('a new post', function () {
    beforeEach(jasmine.requirejs({
        baseUrl: '/public/javascripts'
    }, [
        'models/post.js'
    ]));

    it('has a name', function () {
        var post = new window.APP.Models.Post({name: 'blah'});
        expect(post.get('name')).toEqual('blah');
    });
});

@nicogranelli
Copy link

Now with the code examples I get it. Thanks for taking the time to post them

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment