2016-03-22 15 views
0

さて、私は本当に本当にこの問題を把握するために多くのグーグルを探った。しかし、私がGoogleやStackOverflowで見つけたすべての可能な解決策は、私の問題に本当に取り組んでいません。工場の機能の中で約束を解決する

私の工場
私は(私の場合Firebaseで)データベースからデータを取得するためにサービスを使用して、私の工場の機能(find)を持っています。データが正常にフェッチされた後、検索されたデータは変数に割り当てられます。

問題
私は私のテストスイートで取得したデータを格納する変数をfindを呼び出すまだnullです。だから私は約束が解決されていないと思う。そして私はそれを達成する方法を知らない。

マイコード
リソース/ user.jsの

.factory('User', ['$firebaseRef', function UserFactory($firebaseRef) { 

    var ref = $firebaseRef.child('users'); 

    var User = function(path) { 
     this.data = null; 
     this.find(path); 
    }; 

    User.prototype.find = function(path) { 
     var self = this; 

     if (!path) { 
      return; 
     } 

     ref 
      .child(path) 
      .on('value', function(snapshot) { 
       self.data = angular.extend({}, {$id: snapshot.key()}, snapshot.val()); 
      }); 
    }; 

    return User; 
}]); 

リソース/テスト/ user.spec.js

describe('resource.user', function() { 
    var User, userRef; 

    beforeEach(module('firebase')); 

    beforeEach(function() { 
     module('resource.user') 
    }); 

    beforeEach(inject(function(_User_) { 
     User = _User_; 
     userRef = new User(); 

     spyOn(userRef, 'find').and.callThrough(); 

     userRef.find('some-uuid'); 
    })); 

    it('should resolve the user data when a valid `id` has been given', function() { 
     console.log(userRef.data); 
     expect(userRef.find).toHaveBeenCalled(); 
     expect(userRef.data).not.toBeNull(); // This test fails "Expected null not to be null." 
    }); 

}); 

私が発見した例/チュートリアルインターネットは "コントローラーの内側にのサービス約束を処理するだけです "。

私はサービス自体をテストしているので、私は機能を模擬することはできません(少なくとも私が思っているもの)。

誰かが私を正しい方向に向けることができますか?

答えて

0

以下のアプローチを使用して、$firebaseObjectは有望です。良い方法ではありません

リソース/ user.jsの

.factory('User', ['$firebaseRef','$firebaseObject', function UserFactory($firebaseRef,$firebaseObject) { 

    var ref = $firebaseRef.child('users'); 

    var User = { 
     find:function(uid){ 
      if(!uid) 
       return; 
      return $firebaseObject(ref.child(uid)); 
     } 
    }; 

    return User; 
}]); 

リソース/テスト/ user.spec.js

describe('resource.user', function() { 
    var User; 

    beforeEach(module('firebase')); 

    beforeEach(function() { 
     module('resource.user') 
    }); 

    beforeEach(inject(function(_User_) { 
     User = _User_; 
    })); 

    it('should resolve the user data when a valid `id` has been given', function() { 
     User.find('some-uuid').then(function(data){ 
      console.log(data); 
      expect(data).not.toBeNull(); 
     }); 
    }); 
}); 
+0

。 AngularFireは、スコープコンテキストでデータをスコープと同期させるために使用する必要があります。しかし、あなたの答えをありがとう! – Fortuna

関連する問題