AngularFire业力测试从未达到承诺回调

时间:2015-11-04 15:58:33

标签: javascript angularjs firebase karma-jasmine angularfire

我有一个使用AngularFire' s $firebaseObject的控制器。 当控制器初始化时,它会设置对Firebase的引用,并使用$loaded函数来验证Firebase中的数据是否确实存在。这是控制器的简化代码:

myModule.controller('VotingQuestionsCtrl', ['$scope', '$rootScope', '$firebaseObject',
    function($scope, $rootScope, $firebaseObject) {

        var baseRef = new Firebase("https://somefirebaserepo.firebaseio.com/pathtomyobjects"),
            topicsRef = baseRef.child("topics");                

        var topics = $firebaseObject(topicsRef);            
        $scope.dataLoaded = false;
        topics.$loaded().then(function() {
            $scope.dataLoaded = true;
            topics.$bindTo($scope, 'topics').then(function() {
                //do some stuff                    
            });
        }, function(error) {
            $scope.dataLoaded = true;
            console.log("oh no!");
        });

这款控制器在现实生活中表现相当不错。问题是用Karma测试它。无论我尝试什么,我的测试规范永远不会达到topics.$loaded的回调(既不是成功函数也不是错误函数)。

以下是我的测试规范的当前状态:

describe('VotingQuestionsCtrl', function() {
  var $controller, $scope, $rootScope, $firebaseObject, $stateParams, $q, baseRef, $timeout;

  beforeEach(module('wsApp.controllers'));
  beforeEach(inject(function ($injector) {
    MockFirebase.override();
    $controller = $injector.get('$controller');
    $q = $injector.get('$q');
    $rootScope = $injector.get('$rootScope');
    $timeout = $injector.get('$timeout');
    $scope = $rootScope.$new();
    $firebaseObject = $injector.get('$firebaseObject');
    $rootScope.user = {username: "user"};
    $rootScope.selectedSim = {phase: "phase1"};        
    baseRef = new Firebase("https://somefirebaserepo.firebaseio.com/pathtomyobjects");
    baseRef.set({topics: {simId: {phase1: "bla"}}, users: {}});
    baseRef.flush();
  }));

  it('loads the controller', function(done) {
    $controller('VotingQuestionsCtrl', {$scope: $scope, $rootScope: $rootScope, $firebaseObject: $firebaseObject});
    $scope.$digest();

    setTimeout(function() {
        expect($scope.dataLoaded).toBeTruthy();
        done();
    }, 200);
  });
});

我尝试过各种各样的冲洗,消化,等等......测试通过控制器的其余部分,但异步部分不起作用。

0 个答案:

没有答案