【问题标题】:AngularJS testing $httpBackend.flush() causes errorAngularJS 测试 $httpBackend.flush() 导致错误
【发布时间】:2014-09-10 16:25:15
【问题描述】:

我正在尝试使用 jasmine 对我为 Spotify 创建的 AngularJS 服务进行一些测试。但是在测试 Promise 时,我的测试总是出错。

我的测试目前是这样的:

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
  • 角度模拟:1.2.16
  • 角度场景:1.2.16
  • 业力茉莉花:0.2.0

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

在这方面的任何帮助都会很棒。

【问题讨论】:

    标签: javascript angularjs testing karma-jasmine


    【解决方案1】:

    问题是 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 也可以。

    【讨论】:

    • 你说得对哈哈。这只是 angular 和 angular-mocks 之间的版本不匹配。
    【解决方案2】:

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

    见:

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

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

    【讨论】:

    • 我已经将 angular-mocks.js 注入到 karma 配置文件中。它曾经可以与以前版本的 jasmine 等一起使用。现在它不起作用了。
    • 还不够,最近API变了,现在要使用passThrough或者flush,需要注入ngMockE2E。它是一个组件注入,而不是一个新的文件依赖。实际上,ngMock2E2 是 mock 文件的一部分。
    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多