2017-12-30 43 views
0

私は単体テストしようとしているサービスを持っていますが、そのモジュールに対してのみプライベートであるはずのサービスの機能にはアクセスできません。それをテストしてスパイを置くためには、その機能を他のモジュールに公開する必要があります。私はこれがカプセル化の目的を破り、コーディングのノー・ノーであると感じています。AngularJS関数をカプセル化する方法はまだテスト可能です

例えば、これらの4つの関数はヘルパー関数であり、他のモジュールでは使用されていません。 'vm'オブジェクトに置くことは絶対にありません。このオブジェクトは 'this '大会のために。これは、それを他のモジュールに公開して使用します。これいらない。しかし、もし私がしなければ、私のジャスミンテストがそれらにアクセスすることができないので、テストが失敗します。 :

enter image description here

そこで彼らは、ユニットをテストすることができるか、私は公開せずに私のテストからこれらの変数にアクセスすることができる方法があるので、私は私の他のすべてのモジュールにテストしたいすべての機能を公開するためのソリューションですそれらすべてを。

答えて

1

あなたが言ったように、プライベート関数はユニットテスト中に直接テストするべきではありません。

serviceにプライベートである場合は、同じserviceの内部で呼び出されていることを意味します。

したがって、それらをテストする場所は、それらを呼び出す公開された関数をテストするときです。 サービスでの操作、戻り値などを実行するので、単に「主な公開メソッド」をテストし、describeブロックでプライベート関数が正しく動作することをテストする必要があります。

あなたが言ったように、解決策はすべてを公開することではありません。サービス、工場またはコントローラで。どこでも。

これはJSやAngularに関連するだけでなく、単体テストの標準的な方法です。

簡単な例。

公開されているサービスにfunction1という名前の関数があるとします。 function2というプライベートな別の関数を呼び出して、serviceのプロパティを設定します(サービスによって公開されるカウンタを増やすとします)。

したがって、function2をテストする場所は、function1です。 function1に関連するdescribeブロックには、function2に関連する別のブロックを追加し、function1を呼び出した後にカウンタプロパティが増加したかどうかをテストするテストを追加します。

+0

ああ大丈夫だよ、私はユニットテストを誤解した。私は個々の機能を別々に 'ユニット'としてテストしていると思った。 – MatTaNg

+0

ユニットは、テストがアトミックでなければならないことを意味するので、各テストは単一のアスペクトをカバーする必要があります。たとえば、値を設定し、別の外部関数を呼び出す関数がある場合、2つの異なるテストを実装する必要があります – quirimmo

関連する問題