Firebase / AngularFire - 如何模拟我链接的Firebase参考$ loaded()到?

时间:2017-01-04 03:24:23

标签: angularjs firebase jasmine angularfire

我使用以下函数连接到我的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测试中模拟这个?

2 个答案:

答案 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'
    }
});