2015-03-24 1 views
6

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)

Répondre

6

En fait, figured it out!

Je viens de changer ma maquette pour retourner and.returnValue({ $promise: $q.when(response) })