AngularJS测试$ httpBackend.flush()会导致错误

时间:2014-09-10 07:22:44

标签: javascript angularjs testing karma-jasmine

我正在尝试使用jasmine对我为Spotify创建的AngularJS服务进行一些测试。但在测试承诺时,我的测试仍然出现错误。

我的测试目前是这样的:

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
  });
});

,出现的错误是:

✗ 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

第249行是$ httpBackend.flush()

我使用了karma-jasmine并通过PhantomJS运行测试。

  • AngularJS:1.2.24
  • angular-mocks:1.2.16
  • angular-scenario:1.2.16
  • karma-jasmine:0.2.0

为什么$ httpBackend会尝试更改浏览器中的网址?

对此的任何帮助都会很棒。

2 个答案:

答案 0 :(得分:7)

问题是Angular和Angular-Mocks之间的版本不匹配。最近在Angular-Mocks中添加了这一行:

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

我可以通过将Angular和Angular-Mocks推到1.2.22来解决这个问题,而这两个项目中还没有出现这种变化。但我猜两者的1.2.24也会奏效。

答案 1 :(得分:0)

flush方法是模拟的httpBackend实现的一部分。

见:

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

要使用此HttpBackend实现,您需要在依赖项中注入“ngMockE2E”。