web-dev-qa-db-fra.com

Comment se moquer des classes de dépendance pour les tests unitaires avec mocha.js?

É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???
    });
});
36
mvmoay

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 appelant object.method.restore(); (ou stub.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.

33
victorkohl