【问题标题】:Possibly unhandled rejection in a karma unit test业力单元测试中可能未处理的拒绝
【发布时间】:2024-01-23 02:28:01
【问题描述】:

我使用 jasmine 为控制器编写单元测试,我必须检查一个函数是否在 $scope.$watch 上工作。我使用'controller as' 语法,但我已经注入$scope 来创建一个观察者。但是,我的测试在$scope.$apply() 上抛出了一个模糊的异常。这是我的控制器:

OrderController.$inject = ['Order', 'cart',
    '$mdDialog', '$state', '$rootScope', '$scope'];

function OrderController(Order, cart, $mdDialog, $state, $rootScope, $scope) {

    var vm = this;

    vm.order = new Order({
        name: '',
        phone: '',
        address: ''
    });
    vm.order.items = [];
    vm.promoCode = '';
    vm.order.promo_code = false;

    $scope.$watch('vm.promoCode', function () {
        if (vm.promoCode && vm.promoCode == 'm7e17')) {
            vm.order.promo_code = true;
        }
    }); }

这是我的测试:

describe('Order Controller', function () {
var OrderController, CartService, $scope;
var item = {};
beforeEach(angular.mock.module('app'));
beforeEach(angular.mock.module('app.services'));
beforeEach(inject(function ($controller, _$rootScope_, _cart_, $state, $mdDialog) {
    $scope = _$rootScope_.$new();
    CartService = _cart_;
    CartService.add(item);
    OrderController = $controller('OrderController',
        {
            $scope: $scope,
            $rootScope: _$rootScope_,
            cart: CartService,
            $state: $state,
            $mdDialog: $mdDialog
        }
    );
}));

it('Should save a boolean whether a promo code has been entered', function () {
    expect(OrderController.order.promo_code).toBe(false);
    OrderController.promoCode = 'm7e17';
    $scope.$apply();
    expect(OrderController.order.promo_code).toBe(true);
});         });

但是,当我在规范中调用 $scope.$apply 时,它会引发错误:'Possibly unhandled rejection: ru thrown'。在互联网上找不到任何关于它的信息,所以我在这里做错了什么?我也有其他使用范围的测试,但它们并没有失败(虽然没有在其中调用$scope.$apply),如何解决这个问题?

【问题讨论】:

  • AngularJS 版本?
  • @tasseKATT 角度为 1.5.9
  • 如果您在控制器中删除$mdDialog$state 的注入,同样的错误?
  • @tasseKATT 是的,它实际上一直存在,我尝试添加这些依赖项并查看它们是否是麻烦的微妙原因,但似乎不是。
  • 将尝试重现。

标签: angularjs unit-testing angularjs-scope jasmine karma-runner


【解决方案1】:

我最近遇到了同样的问题。(只有“可能未处理的拒绝:抛出”) 这个问题是由 angular-translate 的设计引起的,我假设你在你的应用程序中使用它。 看看下面的链接: How do unit test with angular-translate

有一些方法可以解决这个问题。 我使用了在自己的文件中提取 translationProvider 配置的那个,在业力中我排除了这个。

angular.module('qPro5App').config(loaderConfig);

loaderConfig.$inject = ['$translateProvider'];

function loaderConfig($translateProvider) {

// translation i18n support
$translateProvider.useStaticFilesLoader({
  files: [{
    prefix: 'assets/i18n/errors-',
    suffix: '.json'
  }, 
  {
    prefix: 'assets/i18n/ui-',
    suffix: '.json'
  }]
});

$translateProvider
  .preferredLanguage('en')
  .fallbackLanguage('en')
  .useSanitizeValueStrategy('sanitize');
}

在业力中:

exclude: ['app/config/app-i18n-loader.js'],

【讨论】:

    【解决方案2】:

    我在稍微不同的上下文(处理承诺)中遇到了同样的问题并添加了

    .catch(angular.noop)
    

    解决了问题。

    【讨论】:

      最近更新 更多