Jasmine
MOAR TESTS
Le problème
La fausse solution
Les outils
●
RequireJS pour modulariser http://requirejs.org/
●
Jasmine pour tester
http://pivotal.github.io/jasmine/
Que fait RequireJS ?
Il permet de gérer les dépendances de chaque
fichier :
models/truc.js:
<module> <deps> <callback>
define('models/truc', ['backbone'], function(Backbone) {
return Backbone.Model.extend({});
});
Dans quel but ?
●
S'assurer qu'un fichier est correctement chargé
avec ses dépendances
●
Pouvoir ne charger que ce dont on a besoin
●
Utiliser r.js pour minifier le tout
Comment utiliser Jasmine ?
●
Page web “classique”, pratique pour test/debug
●
Automatisé avec NodeJS, pour intégration
continue
Test simple
tests/models/truc.js:
define('tests/models/truc', ['models/truc'], function(Truc)
{
describe('models/truc', function() {
describe('someFunction()', function() {
it('always returns true', function() {
expect(new Truc().someFunction()).toBe(true);
});
});
});
});
Quelques fonctions
● .toBe()
● .not.toBe()
● .toMatch(/regexp/)
● .toBeDefined()
● .toBeNull()
http://pivotal.github.io/jasmine/#section-Expectations
Hiérarchie
●
Imbriquez les describe() à volonté !
●
describe(module)
– describe(sous-module)
●
describe(classe)
– describe(fonction)
beforeEach() et afterEach()
●
Respectivement exécuté avant et après chaque
test
●
Concerne seulement le describe() en cours
describe('whatever', function() {
var truc;
beforeEach(function() {
truc = new Truc();
});
});
Espions
●
Intercepte une
fonction
●
Ne l'exécute pas
●
Vérifie son exécution
●
Génère un retour
Syntaxe des espions
spyOn(truc, 'someFunction');
truc.someFunction(123);
expect(truc.someFunction).toHaveBeenCalled();
expect(truc.someFunction).toHaveBeenCalledWith(123);
Options
●
spyOn().andCallThrough() pour que la fonction
soit tout de même appelée
●
spyOn().andReturn(123) pour que la fonction
retourne une valeur particulière
●
spyOn().andCallFake(function(){}) pour
remplacer la fonction par une autre
Et l'asynchrone ?
runs(function() {
doSomeAjax(function callback() {
truc.someProperty = true;
});
});
waitsFor(function() {
return truc.someProperty;
}, 'should do something', 1000); // 1000 = timeout
runs(function() {
expect(truc.someProperty).toBe(true);
});
Donc ?
●
Tester son code, c'est
bien
●
Utiliser Jasmine, c'est
mieux
●
Avec RequireJS ?
1MD2Pm2cbmdgNVkP5kH6cYHZvBDYQFCQnC

Human Talks Jasmine