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???
});
});
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();
)を呼び出すことで復元できます。プロパティがまだ関数でない場合、メソッドをスタブするときのタイプミスを避けるために、例外がスローされます。