1

私は、呼び出されたときに約束を返すファクトリをスタブする必要があるAngularJs単体テストを書いています。私は後でローカルスコープの遅延オブジェクトを使用して、テストで手動で約束を解決します。ユニットテストで延期されたことから約束を返すスタブ付きファクトリを設定しますか?

は私が

let currentUser 
    beforeEach(module(($q, $provide) => { 
    currentUser = $q.defer() 
    $provide.factory('gettingCurrentUser',() => currentUser.promise) 
    })) 

をやろうとしています。しかし、moduleブロックの中に注入することはできません$qのように思えるので、これは動作しません。もちろん、injectブロックに変更すると、$provideはもはや注射可能ではありません!

私はこの問題を数多くの方法でハックすることができますが、ハッキングを必要とするエッジケースになるのは簡単すぎるようです。

これを行う「正しいAngularJs」の方法は何ですか?

答えて

1

これを行う簡単なレシピは、別のブロックの適切な約束事に割り当てられるローカル変数を返すことです(しかし、このサービスをインスタンス化する前に)。

let currentUserPromise; 

    beforeEach(module(($provide) => { 
    $provide.factory('gettingCurrentUser',() => currentUserPromise) 
    })); 

    beforeEach(inject(($q) => { 
    currentUserPromise = $q.resolve(...); 
    })); 

    it(inject((serviceThatDependsOnGettingCurrentUser) => { 
    ... 
    })); 
+0

これは私が「これをハックすることができる」と言ったときに話していたアプローチの1つです。本当に問題を処理する推奨方法ですか?それはとてもハッキーなようです。 –

+0

それはいつものことです。私は、繰延を使用するアプローチがより不器用であることを発見します。 「ハッキー」と思われる理由は、このようなファクトリ・サービスがクラス・インスタンスではなく、それ以外のものではこのような問題を戻すということです。 OOPのパラダイムに従って、 'auth.getCurrentUser'のようないくつかのクラスメソッドを持っていると、この問題は起こりません。 JasmineのcreateSpyObjまたはcreateSpyでスタブし、いつでも 'returnValue'を割り当てることができます。 – estus

関連する問題