Désormais fervent utilisateur de JSUnit et de JSCoverage, il est désormais temps d'apprendre à utiliser JSMock.
JSMock crée automatiquement des mocks a partir d'un objet. Il est ainsi possible de tester l'ordre dans lesquelles les fonctions sont appellé, les arguments passé, renvoyé des valeurs ou encore exécuter des actions.
Regardons ce code:
xmpp.Client = function() {
};
xmpp.Client.prototype = {
connect: function(jid, pass) {
}
};
afflux.Connexion = function(client) {
client.connect(new xmpp.protocol.Jid(), "");
}
Pour tester que la fonction afflux.Connexion passe bien les bon arguments a la méthode connect, on peut utiliser JSMock.
var mockControl = new MockControl();
var mockClient = mockControl.createMock(xmpp.Client);
mockClient.expects().connect(TypeOf.isA(xmpp.protocol.Jid), "");
afflux.Connexion(mockClient);
mockControl.verify();
Si la méthode client.connect est appelé avec de mauvais arguments, JSMock renverra une exception.
Le code précédent encapsulé dans un test JSUnit permetra de bien tester votre code.
JSMock avec JQuery
Si vous désirez tester la manipulation du DOM dans vos tests, vous devriez probablement utiliser JQuery. JQuery est très agréable a utiliser grace à une API élégante.
Pour cacher l'élément avec l'ID afflux
function cache() {
$("#afflux").hide();
}
Pour tester le code précédent, il est nécessaire de faire un peu de tuyauterie.
Transformons d'abord le code précédent pour le rendre plus testable.
function cache(manipulator) {
manipulator("#afflux").hide();
}
Ensuite dans votre cas de test:
var mockControl = null;
var mockJquery = null;
function setUp() {
mockControl = new MockControl();
mockJquery = mockControl.createMock(jQuery.fn);
}
function testCache() {
var manipulator = function(selector) {
assertEquals("#afflux", selector);
return mockJquery;
}
mockJquery.expects().hide();
cache(manipulator);
mockControl.verify();
}
En simulant le selecteur de Jquery et en le passant à la classe que l'on désirer tester, on peut vérifier la simulation du DOM.
Si vous vous demandez comment tester JQuery, c'est un autre problème.