Mock / stub suas dependências de requirejs

O uso de requirejs torna mais fácil simular ou fazer stub em todas as suas dependências. Você tem que criar um novo contexto para o seu teste, onde você pode substituir o caminho para suas dependências e definir simulações para eles:

function createContext(stubs) {

/**
* create a new map which will override the path to a given dependencies

* so if we have a module in m1, requiresjs will look now unter

* stub_m1

**/

var map = {};

_
.each(stubs, function (value, key) {
var stubname = 'stub_' + key;

map
[key] = stubname;


});

/**
* create a new context with the new dependency paths

**/

var context = require.config({
context
: Math.floor(Math.random() * 1000000),
map
: {
"*": map
}
});

/**
* create new definitions that will return our passed stubs or mocks

**/

_
.each(stubs, function (value, key) {
var stubname = 'stub_' + key;

define
(stubname, function () {
return value;
});

});

return context;

}

Em seu teste, você passa um JSON com seus stubs e obtém o contexto no qual pode executar o teste:

define('m1', ['app'], function (app) {
app
.start('test');
});

(function () {
//create stubs
var stubs = {
app
: {start: jasmine.createSpy()}
};
//get context
var context = createContext(stubs);
//start test in the context
context
(['m1'], function (m1) {

describe
("m1", function () {

it
("start the app with the string 'test'", function () {
expect
(stubs.app.start).toHaveBeenCalledWith('test');
});

});
});
})();