1

サービスでこの種のメソッドを取得したとしましょう:

this.search = function (term) {

            var deferred = $q.defer();

             Restangular.all('search').getList(params)
                .then(_onRestResult.bind(this, deferred))
                .catch(_onRestError.bind(this, deferred));


            return deferred.promise;
        }

function _onRestResult(deferred, data) { // notice it isn't on the this

//doSomthing
}

しかし、基本的なテストを実行しています。

句を匿名関数に変更するとthen、すべてが期待どおりに機能しますが、名前付きプライベート関数を使用すると、次のようになります。

TypeError: 'undefined' は関数ではありません ('_onRestResult.bind(this,deferred)' を評価しています)

私はこの種の答えを知っています

ただし、それらはサービスではなくコントローラーを参照しており (:))、プライベート メソッドを使用しないことを提案していますが、実際にはそれらを使用することを好みます。

また、このエラーメッセージが表示されるまで、プライベートメソッドが暗黙的にテストされていることを示唆するこの回答にも遭遇しました。

助けてくれてありがとう!

編集:私はこのようにRestangularを嘲笑していることに注意する必要があります(これが関連する場合):

mockRestangular = {

                one:function(){
                    return this;
                },

                getList:function(calls){
                       answer ={results:['1','2']}

                    var deferred = $q.defer();
                    deferred.resolve(answer);
                    return deferred.promise;
                },

                post:function(called){
                    answer = 'posted: '+called;
                    var deferred = $q.defer();
                    deferred.resolve(answer);
                    return deferred.promise;

                },
                get: function(called){
                    answer = this;
                    var deferred = $q.defer();
                    deferred.resolve(answer);
                    return deferred.promise;
                },


                all:function(){
                    return this;
                }

            };
4

1 に答える 1

3

回答: これはまったく別の問題でした。あいまいなカルマ/チャイ エラー メッセージが間違った方向に私を導いた. 実際の問題(誰かがこの問題に再び遭遇した場合、私は彼らがそうなると信じています..)はbind方法です。bind```が判明しましたphantomjs```` The headless browser we are running the tests with, Doesn't support(すべてではなく、他の es5 メソッドと同様)。chrome/firefox で同じテストを実行すると、完全に機能します。これが問題であることを理解したら、解決は簡単で、ES5-shim lib (bind を含む) を karma.conf.js 構成にインクルード ファイルとして (または他のフレームワークでヘルパーを追加する方法で) 追加するだけでした。すべてが完璧に機能します

于 2014-01-24T13:26:53.500 に答える