【问题标题】:Testing catch promise in Jasmine and AngularJS在 Jasmine 和 AngularJS 中测试捕获承诺
【发布时间】:2016-06-30 11:04:07
【问题描述】:

我的组件中有这样的代码:

p.a().then(function(x) {
  vm.x = x;
  return p.b();
}).then(function(y) {
  if (!y) {
    return $q.reject(new Error('My Error'));
  }
  vm.y = y;
  return y;
}).catch(function(error) {
  log.error(error);
});

我可以很好地测试成功案例:

it('is successful', function(done) {
  spyOn(p, 'a').and.returnValue($q.resolve('x'));
  spyOn(p, 'b').and.returnValue($q.resolve('y'));

  $ctrl = $componentController('myComponent', {
    $scope: $rootScope.$new()
  });

  p.a().then(function() {
    expect($ctrl.x).toEqual('x');
    return p.b();
  }).then(function() {
    expect($ctrl.y).toEqual('y');
    done();
  });

  $timeout.flush();
});

但我无法测试 catch 并断言错误:

it('fails', function(done) {
  spyOn(p, 'a').and.returnValue($q.resolve());
  spyOn(p, 'b').and.returnValue($q.resolve());

  $ctrl = $componentController('myComponent', {
    $scope: $rootScope.$new()
  });

  p.a().then(function() {
    return p.b();
  }).catch(function(error) {
    expect(error).toEqual(new Error('My Error'));
    done();
  });

  $timeout.flush();
});

我在运行测试时得到的只是:

错误:超时 - 未在超时内调用异步回调 由 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定。

这意味着catch 甚至没有运行(我尝试记录一些内容以仔细检查)。

任何想法我做错了什么?

【问题讨论】:

  • 我不确定你想在这里做什么。你为什么不调用你的控制器上的任何函数$ctrl?你在测试什么?测试中的代码?
  • @Sonata,你是什么意思?我打电话给p.a()p.b() 都返回承诺,在他们解决后我在控制器中设置了一些数据,这就是我正在测试的,vm === $ctrl

标签: javascript angularjs testing jasmine promise


【解决方案1】:

考虑使用 $rootScope.$apply(); 而不是使用 jasmine done 功能 购买这个角度会自动运行承诺

记得在测试中注入以下代码来注入 $rootScope:

var $rootScope;
   beforeEach(inject(function(_$rootScope_) {
      $rootScope=_$rootScope_.$new();
   }));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多