2017-12-18 90 views
0

私は別のクラスのインスタンスを作成するテスト対象のクラスを持っています。私は、そのコンストラクタが決して呼び出されないように、2番目のクラス全体をスタブしたいと思います。私は、このセットアップしている場合たとえば、:私のテストファイルでsinon:単なるメソッドではなく、クラス全体をスタブする方法

Test.js

class Test { 
    constructor() { 
    } 

    func() { 
    let foo = new Foo() 
    foo.hello() 
    } 
} 

foo.jsは

class Foo { 
    constructor() { 
    this.a = 1 
    this.b = 2 
    this.c = 3 
    console.log('original constructor') 
    } 

    hello() { 
    console.log('original hello') 
    } 

    goodbye() { 
    console.log('original goodbye') 
    } 
} 

を、私は何とか全体をスタブアウトしたいですFooクラスのため、私はTest.func()のために私のテストを実行するとき、それは元のFooコンストラクタを呼び出すのではなく、返すスタブ付きコンストラクタ偽のFooオブジェクトです。私はhelloファンクFooオブジェクトの機能をoriginal helloの代わりにstubbed helloをスタブするつもりです。

どうすればこのようなクラス全体をスタブすることができますか?

注:テストファイル内で使用できるスタブインスタンスを作成したくないです。コンストラクタ自体をスタブする必要があるので、スタック上の何かがコンストラクタを呼び出すと、スタブインスタンスが返されるようにします。 sinonのドキュメントで

答えて

0

あなたがMyConstructorのスタブオブジェクトを作成したい、しかし、コンストラクタが呼び出される場合は、このユーティリティの機能を使用しない場合。

var stub = sinon.createStubInstance(MyConstructor) 

http://sinonjs.org/releases/v1.17.7/stubs/

+0

私はそれを試してみたが、それは動作しません。これは、テストファイルで使用できるオブジェクトのスタブインスタンスを作成するようです。しかし、コンストラクタ自体をスタブしないので、スタックのどこかで呼び出されると、スタブコンストラクタが呼び出されます。 – ewok

+0

これは変ですので、sinon.stub(obj)との違いです。 createStubInstance(MyConstructor)はコンストラクタ呼び出しです。 – rad

+0

[このファイル](https://pastebin.com/0XjiJUQL)を実行します。テストファイルの中から 'stub.hello()'を呼び出すと、スタブされたメソッドが使用されることがわかります。しかし、 'Test.func'を呼び出して新しい' Foo'オブジェクトを作成し、 'hello()'を呼び出すと、元のコンストラクタとメソッド呼び出しが得られます。 – ewok

関連する問題