2016-01-07 62 views
0

我正在用Karma和Jasmine編寫我的第一個Angular app測試。

我有這個功能的控制器:

function getMyLists() { 
    getLists.getOne().then(function(listOne) { 
    $scope.list1 = listOne[0]; 
    list1Available = true; 
    }); 
    getLists.getTwo().then(function(listTwo) { 
    $scope.list2 = listTwo; 
    list2Available = true; 
    }); 
} 

getMyLists(); 

我已經在測試

describe('MainCtrl', function() { 

    var rootScope, scope, controller, myService; 

    beforeEach(angular.mock.module('myApp')); 

    beforeEach(inject(function($rootScope, $controller, $q) { 
    rootScope = $rootScope; 
    scope = $rootScope.$new(); 

    myService = { 
     getOne: function(){ 
     // mock promise 
     var deferred = $q.defer(); 
     deferred.resolve([ 
      { 
      "one": 1 
     }, 
     { 
      "type": list 
     } 
     ]); 
     return deferred.promise; 
     }, 
     getTwo: function(){ 
     // mock promise 
     var deferred = $q.defer(); 
     deferred.resolve([ 
      { 
      "two": 2 
     }, 
     { 
      "type": list 
     } 
     ]); 
     return deferred.promise; 
     } 
    } 

    controller = $controller('MainCtrl', { 
     $scope: scope, 
     myService: myService 
    }); 
    })); 

    it('should call myService service and populate the array', function(){ 
    scope.$digest(); 
    expect(scope.list1.length).toBeGreaterThan(0); 
    }); 

}); 

這個偉大的工程嘲笑了服務,我有一個測試通過,因爲我期望的那樣。但是當我嘗試和測試下面的例子時,我總是收到錯誤。

expect(scope.list2.length).toBeGreaterThan(0); 
Expected undefined to be greater than 0. 

expect(list1Available).toEqual(false); 
ReferenceError: Can't find variable: list1Available 

就像我說的這些是我的第一次測試,所以任何幫助表示讚賞!

回答

0

嘗試$ rootScope。$ digest(); //解決/拒絕承諾

it('should call myService service and populate the array', function(){ 
    $rootScope.$apply(); 
    expect(scope.list1.length).toBeGreaterThan(0); 
    }); 

您需要list1Available & & scope.list2Available附加到$範圍,使他們能夠在控制器的外部訪問。

function getMyLists() { 
    getLists.getOne().then(function(listOne) { 
    $scope.list1 = listOne[0]; 
    $scope.list1Available = true; 
    }); 
    getLists.getTwo().then(function(listTwo) { 
    $scope.list2 = listTwo; 
    $scope.list2Available = true; 
    }); 
} 

您的測試需要測試scope.list1Available

expect(scope.list1Available).toEqual(false);