【问题标题】:Angular / Karma - $http.get not executingAngular / Karma - $http.get 未执行
【发布时间】:2015-08-09 11:03:06
【问题描述】:

我有一个 AngularJS 项目,它使用 Karma 在浏览器中运行一些单元测试。我正在使用 mocha 作为测试框架。

但是,我有一些规范测试需要读取一些 JSON 文件并检查它们是否符合给定的约定规范(类型、名称约定等)。

我应该明确指出,我要测试的是这些文件的实际内容。不是通过 Angular Mock 的$httpBackend 欺骗的版本。

我正在将 JSON 文件标记为在 karma.conf.js 中提供服务。

files: [
  { pattern: 'static/assets/json/cards/*.json', included: false, served: true },
  'path/to/angular.js',
  'path/to/angular-mocks.js',
  'tests/**/*.js'
]

如果我运行 karma start,我可以浏览到 /base/static/assets/json/cards/something.json 并查看文件正在被提供。

接下来,在我的测试中,$http$q 服务都被注入了。

var $http, $q;

beforeEach(module('chai'));
beforeEach(inject(function(_$http_, _$q_) {
  $http = _$http_;
  $q = _$q_;
}));

然后我尝试使用$http.get 加载每个资源。最后,整理从$http.get 返回的承诺,并调用$q.all 以等待它们全部完成,然后再调用done() 并继续。

it('should load the resources', function(done) {
  var promises = ['admissions.json', 'discharge.json']
  .map(function(resource) {
    console.log('Loading', resource);
    return $http.get('/base/static/assets/json/cards/' + resource);
  });

  $q.all(promises)
  .then(function(card) {
    console.log('Success');
    done();
  }, function(err) {
    console.log('Failure', err);
    done();
  });
});

当我的测试运行时,我看到以下控制台输出:

Loading admissions.json
Loading discharge.json
Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

起初我以为加载时间过长可能超过了超时,但文件只有 95kb。

接下来,我想知道$http 的自定义promise 接口(@98​​7654335@ 和.error)是否破坏了$q.all 方法。但显然不是。

最后我尝试在所有测试开始时单独请求/base/static/assets/json/cards/admissions.json

它返回一个承诺,正如预期的那样,但它永远不会被解决,因为没有响应被发回。我检查了网络工具以查看返回的内容,结果发现甚至一开始都没有发出请求。代码肯定会运行,但出于某种原因,$http 实际上并没有发出请求。

我的倾向是,这与 Angular Mocks 拦截 $http 对其自己的 $httpBackend 服务的请求有关。我该如何规避呢?

【问题讨论】:

    标签: javascript angularjs karma-runner angular-mock karma-mocha


    【解决方案1】:

    我在this blog 中找到了解决方案。问题在于您必须添加范围的摘要,即使您没有测试控制器。

    it('does a thing one way', function() {
        var value;
        deferred.promise.then(function(_value_) {
            value = _value_;
        });
        deferred.resolve(10);
        expect(value).not. toBe(10); // not yet 10 because $digest hasn't run
        $scope.$digest();
        expect(value).toBe(10); // 10 because $digest already ran
    });
    

    【讨论】:

      猜你喜欢
      • 2020-02-07
      • 1970-01-01
      • 2020-01-12
      • 2017-02-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-21
      • 2019-03-21
      • 2015-02-10
      相关资源
      最近更新 更多