Étant donné que j'ai deux classes ES6.
C'est la classe A:
import B from 'B';
class A {
someFunction(){
var dependency = new B();
dependency.doSomething();
}
}
Et classe B:
class B{
doSomething(){
// does something
}
}
Je fais des tests unitaires en utilisant mocha (avec babel pour ES6), chai et sinon, ce qui fonctionne vraiment bien. Mais comment puis-je fournir une classe fictive pour la classe B lors du test de la classe A?
Je veux me moquer de toute la classe B (ou la fonction nécessaire, n'a pas vraiment d'importance) pour que la classe A n'exécute pas de vrai code mais je peux fournir des fonctionnalités de test.
Voici à quoi ressemble le test mocha pour l'instant:
var A = require('path/to/A.js');
describe("Class A", () => {
var InstanceOfA;
beforeEach(() => {
InstanceOfA = new A();
});
it('should call B', () => {
InstanceOfA.someFunction();
// How to test A.someFunction() without relying on B???
});
});
Vous pouvez utiliser SinonJS pour créer un stub pour empêcher l'exécution de la fonction réelle.
Par exemple, étant donné la classe A:
import B from './b';
class A {
someFunction(){
var dependency = new B();
return dependency.doSomething();
}
}
export default A;
Et classe B:
class B {
doSomething(){
return 'real';
}
}
export default B;
Le test pourrait ressembler à:
describe("Class A", () => {
var InstanceOfA;
beforeEach(() => {
InstanceOfA = new A();
});
it('should call B', () => {
sinon.stub(B.prototype, 'doSomething', () => 'mock');
let res = InstanceOfA.someFunction();
sinon.assert.calledOnce(B.prototype.doSomething);
res.should.equal('mock');
});
});
Vous pouvez ensuite restaurer la fonction si nécessaire en utilisant object.method.restore();
:
var stub = sinon.stub (objet, "méthode");
Remplace object.method par une fonction stub. La fonction d'origine peut être restaurée en appelantobject.method.restore();
(oustub.restore();
). Une exception est levée si la propriété n'est pas déjà une fonction, pour éviter les fautes de frappe lors du stubbing.