2015-09-21 19 views
20

私には2つのES6クラスがあります。mocha.jsを使用した単体テストの依存関係クラスの模擬方法

これはクラスAである:

import B from 'B'; 

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

とクラスB:

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

私は本当に素晴らしい作品(ES6用バベルと)モカを使用してユニットテスト、チャイとsinon、と思います。しかし、クラス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??? 
    }); 
}); 
+0

[DI](https://en.wikipedia.org/wiki/Dependency_injection) – Mritunjay

答えて

20

あなたが実行される実際の関数を防ぐためにstubを作成するためにSinonJSを使用することができます。例えば

、与えられたクラス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スタブ= sinon.stub(オブジェクト、 "方法")。
object.methodを スタブ機能で置き換えます。元の関数は、 object.method.restore();(またはstub.restore();)を呼び出して復元できます。 スタブメソッドの場合に、プロパティがまだ関数でない場合は、例外がスローされて、 が投げられます。

+0

Woaについて読んでください。それは簡単です。プロトタイプを変更することを考えなかった。ありがとう! :)コンストラクタをモックする方法についてのヒントはありますか?同じように働かないようですね? – mvmoay

+1

チェックは、この答えは私がhttp://stackoverflow.com/questions/32550115/mocking-javascript-constructor-with-sinon-js/32551410#32551410 – victorkohl

+0

数日前には、どのようにBのコンストラクタのためにこれを行うだろう与えましたか? – Willwsharp