2014-09-10 19 views
5

Ich versuche, einige Tests mit Jasmine für einen AngularJS-Dienst zu machen, den ich für Spotify erstellt habe. Aber ich bekomme immer wieder einen Fehler mit meinen Tests, wenn ich das Versprechen einchecke.

Mein Test ist derzeit wie folgt aus:

describe('Spotify.search', function() { 
    var $httpBackend; 
    var $rootScope; 
    var Spotify; 
    var api = 'https://api.spotify.com/v1'; 

    beforeEach(inject(function(_Spotify_, _$httpBackend_, _$rootScope_) { 
    Spotify = _Spotify_; 
    $httpBackend = _$httpBackend_; 
    $rootScope = _$rootScope_; 
    jasmine.getJSONFixtures().fixturesPath='base/test/mock'; 
    })); 

    it('should return an array of artists', function() { 
    $httpBackend.when('GET', api + '/search?q=Nirvana&type=artist').respond(
     getJSONFixture('search.artist.json') 
    ); 

    Spotify.search('Nirvana', 'artist').then(function (data) { 
     expect(data).toBeDefined(); 
     expect(data.artists.items.length).toBeGreaterThan(0); 
    }); 

    $httpBackend.flush(); //This line causes the error 
    }); 
}); 

und den Fehler, der herauskommt, ist:

✗ should return an array of artists 
TypeError: 'undefined' is not a function (evaluating '$browser.$$checkUrlChange()') 
    at /Users/XXXX/Work/angular-spotify/bower_components/angular/angular.js:12502 
    at /Users/XXXX/Work/angular-spotify/bower_components/angular-mocks/angular-mocks.js:1438 
    at /Users/XXXX/Work/angular-spotify/test/spec/angular-spotify.spec.js:249 

Linie 249 $ httpBackend.flush()

Ich verwende Karma-Jasmine und Lauftests durch PhantomJS.

  • AngularJS: 1.2.24
  • Winkel Mocks: 1.2.16
  • Winkel-Szenario: 1.2.16
  • Karma-Jasmin: 0.2.0

Warum $ würde httpBackend versucht, die URL im Browser zu ändern?

Jede Hilfe dazu wäre großartig.

Antwort

7

Das Problem ist, dass Ihre Version nicht zwischen Winkel- und Angular-Mocks liegt. Diese Linie wurde vor kurzem in Angular-Mocks hinzugefügt:

https://github.com/angular/angular.js/blob/v1.2.24/src/ngMock/angular-mocks.js#L59

ich dieses Problem beheben könnte sowohl Winkel- und Schräg-Mocks zu 1.2.22 schieben, wo diese Änderung in beiden Projekten präsentiert noch nicht. Aber ich denke 1,2,24 für beide würde auch funktionieren.

+0

Du hast recht, haha. Es war nur eine Version Missmatch zwischen eckigen und eckigen Mocks. –

+0

große Antwort! Vielen Dank. – Rocco

0

Die Flush-Methode ist Teil der gespielten httpBackend-Implementierung.

See:

https://github.com/angular/angular.js/blob/master/src/ngMock/angular-mocks.js#L1823

Um diese Implementierung zu verwenden HttpBackend Sie brauchen 'ngMockE2E' in Ihre Abhängigkeiten zu injizieren.

+0

Ich injiziere angular-mocks.js bereits in die Karma-Konfigurationsdatei. Es hat früher mit früheren Versionen von Jasmin usw. funktioniert, jetzt funktioniert es nicht mehr. –

+0

Es ist nicht ausreichend, die API hat sich kürzlich geändert, und jetzt müssen Sie ngMockE2E injizieren, um passThrough oder flush zu verwenden. Es ist eine Komponenteninjektion und keine neue Dateiabhängigkeit. Eigentlich ist ngMock2E2 Teil der Mock-Datei. – benek

Verwandte Themen