2015-05-26 66 views
1

我試圖測試這個控制器功能:

$scope.deleteAccount = function(account) { 

    Account.deleteAccount(account._id) 
    .then(function() { 
    angular.forEach($scope.accounts, function(a, i) { 
     if (a === account) { 
     $scope.accounts.splice(i, 1); 
     } 
    }); 
    }) 
    .catch(function(err) { 
    $scope.errors.other = err.message; 
    }); 
}; 

這是一個管理頁面上。該函數調用工廠(承諾),工廠刪除服務器上的帳戶。然後該函數刪除範圍內的元素,以便刪除的元素不再顯示。

我的測試看起來像這樣:

beforeEach(inject(function ($controller, $rootScope, _$location_, _$httpBackend_) { 

    $scope = $rootScope.$new(); 
    $location = _$location_; 
    $httpBackend = _$httpBackend_; 
    fakeResponse = ''; 

    AdminAccountCtrl = $controller('AdminAccountCtrl', { 
     $scope: $scope 
    }); 
    $location.path('/admin/account'); 
})); 

it('test delete account', function() { 
    expect($location.path()).toBe('/admin/account'); 

    $httpBackend.expectGET('/api/accounts').respond([{_id: 1}, {_id: 2}, {_id: 3}]); 
    $httpBackend.when('GET', 'app/admin/admin.account.html').respond(fakeResponse); 
    $httpBackend.when('DELETE', '/api/accounts/1').respond(fakeResponse); 
    $httpBackend.flush(); 

    $scope.deleteAccount($scope.accounts[0]); 
    expect($scope.accounts).toEqual([{_id: 2}, {_id: 3}]); 
}); 

可悲的結果是:

Expected [ { _id : 1 }, { _id : 2 }, { _id : 3 } ] to equal [ { _id : 2 }, { _id : 3 } ]. 
+0

而......你的問題是什麼? – Aracthor

+0

第一個元素未被刪除 - 測試失敗。 我想知道爲什麼數組沒有改變。 –

回答

0

嘗試調用deleteAccount$scope.$digest()。這是必需的,因爲測試沒有像在瀏覽器中正常運行的方式那樣具有摘要循環。

$scope.deleteAccount($scope.accounts[0]); 
$scope.$digest(); 
expect($scope.accounts).toEqual([{_id: 2}, {_id: 3}]); 
+0

感謝您的回覆,但恐怕它不起作用。我也試圖偵測函數和$ scope。$ apply(),但錯誤依然存在。 –

+0

也許你還需要移動'$ httpBackend.flush()'在'deleteAccount'後面運行flush# – yarons

+0

移動flush沒有工作的賬號是未定義的。但在deleteAccount工作後第二次調用flush。非常感謝你。 ''' ... $ httpBackend.when('DELETE','/api/accounts/1').respond(fakeResponse); $ httpBackend.flush(); $ scope.deleteAccount($ scope.accounts [0]); $ httpBackend.flush(); ... ''' –