2017-05-19 15 views
0

ユニットテストケースの作成中にSinonを使用して依存関係をモックしようとしています。私はいくつかの問題に直面したが、ついにそれを機能させた。しかし、それが働いている方法は本当に私にとって奇妙に見えます。ユニットテストで実際のオブジェクトを使用しますが、Sinon MockedオブジェクトはJavascript ES6にありません

クラスEmployeeはクラスDataに依存し、したがってDataオブジェクトはクラスEmployeeのコンストラクタに依存性注入されます。ここで

は動作するコードです:

class Data{ 
    getName(){ 
     return "Ram"; 
    } 
} 

class Employee{ 
    constructor(data){ 
     this._data = data; 
    } 

    getName(){ 
     return this._data.getName(); 
    } 
} 

describe('canary suite', function(){ 
    it('canary test', function(){ 

     var data = new Data(); 
     var mockData = sinon.mock(data);   
     mockData.expects('getName').returns('Raj'); 

     var emp = new Employee(data); //here is the deviation. 

     expect(emp.getName()).equals('Raj'); 
     mockData.verify(); 
     mockData.restore(); 
    }); 
}); 

私はコードでこの行を変更した場合:

var emp = new Employee(mockData); 

var emp = new Employee(data); 

を、それは、このエラーを与える:

TypeError: this._data.getName is not a function

私はC#でモックを扱っています。しかしそこでは、私は嘲笑されたオブジェクトをコンストラクタに渡しました。実際のオブジェクトではありません。
誰かがSinon Mockingでこの動作の理由を理解するのを助けることができますか?

答えて

1

C#のような言語では、タイプ/インタフェースとパブリック/プライベートスコープとともに、オブジェクトインスタンスは通常不変です。つまり、元のオブジェクトのクラス/インタフェースの「空シェル」としてモックを作成する方が一般的です。

Javascriptは最近、クラスと継承などをサポートしています。コアではPrototype-basedです。ダグラス・クロックフォードから

:JavaScriptで、それは元のオブジェクトのインスタンス自体に模擬するために、より理にかなって、なぜSinonはモックの挙動を削除するrestore()を提供する理由

you make prototype objects, and then … make new instances. Objects are mutable in JavaScript, so we can augment the new instances, giving them new fields and methods. These can then act as prototypes for even newer objects. We don't need classes to make lots of similar objects… Objects inherit from objects.

です。

関連する問題