Teste um projeto de requirejs usando mocha-phantomjs, chai e sinon

Eu estava tentando esta semana configurar e testar um projeto requirejs . Ele usa mocha-phantomjs para executar os testes; chai como a biblioteca de asserções; e sinon.js para simular ou stub dependências.

Eu tentei este como fazer o teste requirejs com mocha-phantomjs e grunt , mas não obtive informações suficientes sobre como adicionar chai e sinon.

Finalmente concluo que a maneira melhor e mais fácil de conseguir isso é assim:

  • sinon.js incluído em uma tag de script no testRunner.html
  • chai.js incluído na definição do módulo assíncrono por requirejs.

testRunner.html

<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="lib/node_modules/mocha/mocha.css" />
</head>
<body>
<div id="mocha"></div>
<script src="lib/node_modules/sinon/pkg/sinon.js"></script>
<script src="lib/node_modules/mocha/mocha.js"></script>
<script>
mocha
.ui('tdd');
</script>
<script src="../scripts/require.js" data-main="test.config.js" ></script>
</body>
</html>

test.config.js

require.config({
baseUrl
: "../scripts/src",
paths
: {
chai
: '../../test/lib/node_modules/chai/chai'
}
});

require([
'../../test/src/UserMediaTest'
], function() {
if (typeof mochaPhantomJS !== "undefined") { mochaPhantomJS.run(); }
else { mocha.run(); }
});

UserMediaTest.js

chai pode ser adicionado na definição do módulo assíncrono, mas por algum motivo, o sinon não pode. Requirejs não o definirá. É por isso que é adicionado a uma tag de script no testRunner.html

define(['chai', 'UserMedia','NavigatorWrapper'], function(chai, UserMedia, NavigatorWrapper) {
suite
('NavigatorWrapper.hasGetUserMedia', function() {
var sut, mockNavigator, instanceNavigator;
setup
(function() {
instanceNavigator
= new NavigatorWrapper();
mockNavigator
= sinon.mock(instanceNavigator);
sut
= new UserMedia(instanceNavigator);
});

....

});
});

Você pode ver mais em https://github.com/tomas2387/webrtcApp