我使用以下函数连接到我的Firebase对象:
$scope.getData= function(param){
var ref = new Firebase(firebaseConstants.url + 'data/' + param);
var sync = $firebase(ref.orderByChild('timestamp').limitToLast(1));
return sync.$asArray();
};
我以下列方式使用上述方法:
$scope.setData= function(param){
var lastMessage = $scope.getData(param);
lastMessage.$loaded().then(function(){
$scope.message = lastMessage.message;
$scope.images = lastMessage.images;
}, function(data){
console.log(data);
});
};
在我的Jasmine测试文件中,我有以下内容:
describe('setData Test', function(){
it('should please me', function(){
var param = 932489234;
spyOn(scope, 'getData').and.returnValue({
$loaded: function(){
deferred = q.defer();
deferred.resolve({
$id: 'talk to you',
message: 'brother',
images: {
0: 'www.google.com',
1: 'www.paper.com',
2: 'www.sun.com'
}
});
return deferred.promise;
}
});
scope.setData(param);
scope.$apply();
});
});
上述测试允许我模拟正在解析的$loaded()
,但在承诺解决后我无法获得lastMessage
的值。
似乎lastMessage
首先以promise的形式返回一个函数,然后在初始promise解析后返回值变为实际的响应对象。
如何在我的Jasmine测试中模拟这个?
答案 0 :(得分:0)
您可以跟踪已加载$ loaded函数的次数。如果是第一次调用,则返回promise,如果是第二次调用,则返回已解析的值。
这样的事情:
_calls: 0,
$loaded: function() {
var self = this;
self._calls += 1;
if (self._calls === 1) {
// ...
return deferred.promise.then(function(value) {
self._resolvedValue = value;
return value;
});
} else {
return self._resolvedValue;
}
}
答案 1 :(得分:0)
您可以使用链接到$loaded()
的回调函数参数来解决此问题。而不是使用:
lastMessage.$loaded().then(function(){}
我用过
lastMessage.$loaded().then(function(data){
// lastMessage === data
})
在这种情况下, data
与回调函数中的lastMessage
具有相同的值。这样您就可以使用以下内容在Jasmine测试中为data
指定值:
deferred.resolve({
$id: 'talk to you',
message: 'brother',
images: {
0: 'www.google.com',
1: 'www.paper.com',
2: 'www.sun.com'
}
});