好的,我真的搜索了很多东西来掌握这个问题。但是我在谷歌或StackOverflow上找到的每一个可能的解决方案并没有真正解决我的问题。
我的工厂
我的工厂中有一个函数(find
),它使用服务从数据库中检索数据(在我的案例中是Firebase)。成功获取数据后,将检索到的数据分配给变量。
问题
当我在测试套件中调用find
时,包含检索数据的变量仍为空。所以我猜这个承诺还没有解决。我不知道如何实现这一点。
我的代码
资源/ 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 :(得分: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();
});
});
});