2011-11-11 10 views
4

の外にNode.jsのモジュール内のコンストラクタ(またはその他の機能)をモックが、私は、他のテストフレームワークを使用してこの問題を持っているだろうと思います。今、私はBarをテストしたいと思います私は私のテストを書くためにジャスミンを使用しています。このモジュール

var Bar = exports.Bar = function Bar() { 
    this.baz = new Baz(); 
}; 

var Baz = exports.Baz = function Baz() { 

}; 

が、偽のBaz実装と:我々はコンストラクタです(ちょうど通常の機能することができる)の二つの機能、BarBaz、とモジュールfooを持っているとしましょう:

var foo = require('foo'); 

describe("foo.Bar", function() { 
    it("initializes its own Baz", function() { 
    spyOn(foo, 'Baz'); // this replaces foo.Baz with a fake implementation 
    var bar = new foo.Bar(); 
    expect(foo.Baz).toHaveBeenCalled(); 
    }); 
}); 

Barを外部から変更することができない変数Bazを使用して新しいBazをインスタンス化するための問題は、このテストが失敗することです。 spyOn()を使用してスワップしまった唯一のものはexports.Bazです。

明白な解決策はthis.baz = new exports.Baz();を書くことですが、それは一種のぎこちない感じています。私のモジュールの中で使用したいもっと多くの機能があるなら、私はいつもexports.接頭辞を使ってそれらのすべてを呼び出さなければなりません。ここに他のアプローチはありますか?

+0

'spyOn(ウィンドウ、 'バズ')を試してみてください;'と '(window.Baz).toHaveBeenCalledを()期待;」。 – Prusse

+0

@Prusse、Nodeは 'window'オブジェクトを持っていないと思います。 –

+0

申し訳ありませんが、グローバルオブジェクトがある場合は、それをそのまま使用できます。 – Prusse

答えて

1

バズクラスの他の実装が棒に与えられることを可能にするようにあなたが何らかの形で、これら2つのクラスを切り離すことができるなら、私はそれが最善の方法だと思う、あなたはそれのために行く必要があります。


しかし、あなたが本当にBazとしてexports.Bazを参照することができることができるようにしたい場合は、その後、私は考えることができ一つの方法は、withを使用して、あります。

withを使用すると、一般的に悪い習慣であり、避けるべきですが、自分のコードでは使用しないと言われていますが、これを解決する方法の1つはa legimate use何をしているの。

ここでは、行く:別のモジュールで

with(exports) { 

    exports.Bar = function Bar() { 
     console.log('this is bar!'); 
     this.baz = new Baz(); 
    }; 

    exports.Baz = function Baz() { 
     console.log('original baz!'); 
    }; 

} 

をあなたが何か他のものにfoo.Bazを変更した場合、fooの内部Bazも、それまでになります。

私はまだお互いのこの2つのクラスを独立させるために、その後、あなたはちょうどあなたが好きなバズの実装バーを与えることができる方法を見つけることをお勧めします。

+0

'with 'を使うのは興味深いですが、あまりにもハッキリですね。私は 'Baz'が' Bar'の外で決してインスタンス化されないので、2つの "クラス"を切り離したくないです。 'Baz'を内部実装の詳細としてテストするべきではないかもしれないが、実際にはシステム全体の動作は非常に複雑で、より細かいテストが必要です。とにかくヒントをありがとう。 –

関連する問題