web-dev-qa-db-ja.com

mocha.jsを使用して単体テストの依存関係クラスをモックする方法は?

ES6クラスが2つあると仮定します。

これはクラスAです。

import B from 'B';

class A {
    someFunction(){
        var dependency = new B();
        dependency.doSomething();
    }
}

クラスB:

class B{
    doSomething(){
        // does something
    }
}

私はモカ(ES6のbabelを使用)、チャイ、シノンを使用して単体テストを行っています。しかし、クラスAをテストするときに、クラスBに模擬クラスを提供するにはどうすればよいですか?

クラスAが実際のコードを実行しないように、テスト機能を提供できるように、クラスB全体(または必要な関数、実際は問題ではない)をモックしたい。

これは、今のところモカテストがどのように見えるかです:

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

SinonJSを使用して stub を作成し、実際の関数が実行されないようにすることができます。

たとえば、クラスAが与えられた場合:

_import B from './b';

class A {
    someFunction(){
        var dependency = new B();
        return dependency.doSomething();
    }
}

export default A;
_

クラスB:

_class B {
    doSomething(){
        return 'real';
    }
}

export default B;
_

テストは次のようになります。

_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');
    });
});
_

その後、必要に応じてobject.method.restore();を使用して関数を復元できます。

var stub = sinon.stub(object、 "method");
object.methodをスタブ関数に置き換えます。元の関数は、object.method.restore();(またはstub.restore();)を呼び出すことで復元できます。プロパティがまだ関数でない場合、メソッドをスタブするときのタイプミスを避けるために、例外がスローされます。

33
victorkohl