Angular-Bootstrap“可能未处理的拒绝:未定义的抛出”

时间:2017-02-06 15:59:26

标签: angularjs angular-bootstrap

当我遇到这个奇怪的问题时,我正在编写测试代码。如果我在执行$rootScope.$digest();后执行myModal.dismiss();,我会获得Possibly unhandled rejection: undefined thrown。我在angular-bootstrap库中查看了Modal的单元测试,我注意到他们正在使用$animate做一些事情。也许这有关系?

it('tests weird failure', function(){
  var myModal = this.$uibModal.open({
    template: '<div class="modalTwo"></div>',
    size: "md"
  });

  this.$rootScope.$digest();
  myModal.dismiss();
  this.$rootScope.$digest();
});

1 个答案:

答案 0 :(得分:0)

我不确定这是否有帮助,但可能会有所帮助。我有工作测试涉及$ uibModal被解雇,但是当我在新机器上运行我的项目的npm install时,我开始看到其中一个错误。我的问题最终是因为我没有在我的测试代码中处理被拒绝的承诺的情况。奇怪的是,测试仍然在我的旧机器上进行,所以我做了一些挖掘(当然不是一吨),并发现两台机器(1.0.2和1.1.0)之间的karma-jasmine版本不同。我相信这就是为什么我在一台机器而不是另一台机器上得到错误的原因。

正在测试的代码重现问题:

$confirm({
    text: 'Are you sure you want to do this?',
    title: 'Are you sure?'
}).then(
    function() {
        $scope.model.things.pop();
    }
);

测试此代码以拒绝承诺的规范:

scope.model.things = [{id: 1}, {id: 2}, {id: 3}];

deferred.reject();

expect(scope.model.things).toEqual([{id: 1}, {id: 2}]);

请注意,在测试中的代码中没有第二个函数会在事件$ confirm(来自angular-confirm库的东西)被拒绝的情况下被调用(在这种情况下,这意味着用户在弹出窗口中点击了No)。对我的代码进行这一小改动后,我的测试就通过了:

$confirm({
    text: 'Are you sure you want to do this?',
    title: 'Are you sure?'
}).then(
    function() {
        $scope.model.things.pop();
    }, function() {}
);

这里唯一的区别是我有一个空函数来处理&#34;处理&#34;被拒绝的承诺。我希望这会有所帮助。