2015-07-06 2 views
0

Я пытаюсь проверить свои угловые контроллеры и вам нужно издеваться над несколькими услугами, чтобы сделать это. Я сосредоточусь на одной службе в этом вопросе, так как функция останова аналогична. Я использую инъекции зависимостей, чтобы получить Ахольд playersService и использовать его как и в моем контроллере:Как издеваться над методом угловой службы, который принимает параметр

angular.module('gameApp') 
    .controller('PlayerInfoController', PlayerInfoController); 

PlayerInfoController.$inject = ['$scope', '$routeParams', 'playersService']; 

function PlayerInfoController($scope, $routeParams, playersService) { 
    var vm = this; 
    var playerId = $routeParams.playerId; 

    playersService.getDetails({ 
    playerId: playerId 
    }).$promise.then(function(details) { 
    vm.details = details; 
    }); 
} 

Соответствующая услуга выглядит следующим образом:

angular.module('gameApp') 
    .factory('playersService', ['$resource', 
    function($resource) { 
     var base = '/api/players/:playererId/'; 
     return $resource(base, {}, { 
     getDetails: {method: 'GET', url: base + 'details'} 
     }); 
    }]); 

Ниже моя текущая установка модульного тестирования, который не может с следующее сообщение об ошибке: TypeError: 'undefined' is not an object (evaluating 'playersService.getDetails({playerId: playerId}).$promise.then')

describe('PlayerInfoController', function() { 
    var scope; 
    var routeParams; 
    var playersService; 

    beforeEach(function() { 
    var mockPlayersService = {}; 
    module('gameApp', function($provide) { 
     $provide.value('playersService', mockPlayersService); 
    }); 
    inject(function($q) { 
     mockPlayersService.details = { 
     'firstName': 'John', 
     'lastName': 'Doe', 
     'country': 'US' 
     }; 

     mockPlayersService.getDetails = function(playerId) { 
     var defer = $q.defer(); 
     defer.resolve(this.details); 
     return defer.promise; 
     }; 
    }); 
    }); 

    beforeEach(inject(function($controller, $rootScope, _$routeParams_, _playersService_) { 
    scope = $rootScope.$new(); 
    routeParams = _$routeParams_; 
    playersService = _playersService_; 

    $controller('PlayerInfoController', {$scope: scope, $routeParams: routeParams, playersService: playersService}); 

    scope.$digest(); 
    })); 

    it('should say 2 === 2', function() { 
    expect(2).toEqual(2); 
    }); 
}); 
+0

Это не может быть ошибка, но "$ rpomise" не требуется в строке "playersService.getDetails ({ playerId: playerId }) $ promise.then.": GetDetails уже должен вернуть обещание – pdem

ответ

2

playersService.getDetails обычно возвращает относительно пустой объекта со свойством $ обещания, как только вызов заканчивает т его объект заселен результатом.

Ваш mockPlayersService.getDetails должен возвращать подобный объект, так что-то вроде этого нужно сделать:

mockPlayersService.getDetails = function(playerId) { 
    var defer = $q.defer(); 
    defer.resolve(this.details); 
    return angular.extend({$promise: defer.promise}, this.details); 
    }; 

И как примечание, в соответствии с угловыми документы вы обычно использовать услугу, как это (второй параметр может быть функцией для вызова успеха вместо использования $ обещания).

playersService.getDetails({ 
    playerId: playerId 
}, function(details) { 
    vm.details = details; 
}); 

Это также потребует, чтобы вы изменили свой макет службы.