2014-02-23 100 views
3

我正在使用AngularJS 1.2.10。 我的應用程序的工作原理是,問題只出現在單元測試中。 當通信$ httpBackend更新(HTTP PUT),不調用回調,所以我的測試失敗

控制器方法我想測試看起來像:

$scope.updateName = function(name, release) { 
    $scope.isLoading = true; 
    release.name = name; 
    release.$update({ projectId: $scope.projectId }, function() { 
     $scope.isLoading = false; 
    }, function(err) { 
     console.log(err); 
    }); 
}; 

它使用該服務:

angular.module('app.release').factory('ReleaseService', ['$resource', function($resource) { 
    return $resource('projects/:projectId/releases/:releaseId', { 
     releaseId: '@_id' 
    }, { 
     update: { 
      method: 'PUT' 
     } 
    }); 
}]); 

和單元測試:

it('$scope.updateName() should update release name', inject(function(ReleaseService) { 

    var data = function(){ 
     return { 
      _id: '456', 
      name: 'v1.0', 
      description: 'A Release' 
     }; 
    }; 

    // mock release object 
    var release = new ReleaseService(data()); 
    scope.release = release; 
    scope.projectId = '123'; 
    $httpBackend.expectPUT('projects/123/releases/456').respond({ 
      _id: '456', 
      name: 'a new name', 
      description: 'A Release' 
     }); 
    scope.updateName('a new name', release); 
    $httpBackend.flush(); 
    expect(scope.isLoading).toBe(false); // fails 
})); 

更新:我試圖添加範圍。$ digest()就在最終expect()之前,就像在Why is my $q deferred not resolving in Angular unit test?中一樣,但它在我的情況下不起作用:(

回答

3

這是我如何最終修復測試:

it('$scope.updateName() should update release name', inject(function(ReleaseService) { 

    var data = { 
     _id: '456', 
     name: 'v1.0', 
     description: 'A Release' 
    }; 

    var expectedResponse = { 
     _id: '525a8422f6d0f87f0e407a33', 
     name: 'a new name', 
     description: 'A Release about Agile Warlock' 
    }; 

    // mock release object 
    var release = new ReleaseService(data); 
    scope.release = release; 
    scope.projectId = '123'; 
    $httpBackend.expectPUT('projects/123/releases/456').respond(expectedResponse); 
    scope.updateName('a new name', release); 
    $httpBackend.flush(); 
    expect(scope.isLoading).toBe(false); 
}));