J'utilise $resource
pour mettre en place des appels API, et pendant le test, je l'ai adopté l'approche générale de l'injection $q
et puis en faisant
mockMyService.doSomethingAsync.andReturnValue($q.when(successResponse))
Cela travaille assez bien, cependant, j'ai une méthode qui ressemble à ce qui suit:
# MyService
MyService.doSomethingAsync(params).$promise.then ->
$scope.isLoading = false
# MyService Spec
mockMyService =
doSomethingAsync: jasmine.createSpy('doSomethingAsync')
it 'calls service #doSomethingAsync', ->
inject ($q) -> mockMyService.doSomethingAsync.and.returnValue($q.when(response))
controller.methodThatWrapsServiceCall()
scope.$apply()
expect(mockMyService.doSomethingAsync).toHaveBeenCalled()
et, malheureusement, la stratégie décrite ci-dessus se moquant ne semble pas fonctionner quand un $promise.then
est enchaîné à la fin. Je termine avec l'erreur suivante:
TypeError: 'undefined' is not an object (evaluating 'MyService.doSomethingAsync(params).$promise.then')
Les méthodes qui se terminent simplement avec doSomethingAsync().$promise
passer les tests sans problème à l'aide de cette stratégie moqueur.
(Autres infos: Ce sont Jasmine tests obtenus avec Karma et PhantomJS)