さて、私は本当に本当にこの問題を把握するために多くのグーグルを探った。しかし、私が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."
});
});
私が発見した例/チュートリアルインターネットは "コントローラーの内側にのサービス約束を処理するだけです "。
私はサービス自体をテストしているので、私は機能を模擬することはできません(少なくとも私が思っているもの)。
誰かが私を正しい方向に向けることができますか?
。 AngularFireは、スコープコンテキストでデータをスコープと同期させるために使用する必要があります。しかし、あなたの答えをありがとう! – Fortuna