在业力单元测试中可能未处理的拒绝

时间:2017-01-05 19:39:49

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

我使用jasmine为控制器编写单元测试,我必须检查函数是否在 string answer; while (true) { Console.WriteLine("Enter your favorite animal:"); answer = Console.ReadLine(); if (new Regex("^[A-Z][a-z]*$").IsMatch(answer)) { Console.WriteLine("You like {0}s. Cool!", answer); Console.ReadKey(); break; } else { Console.WriteLine("'{0}' is not a valid answer.", answer); Console.WriteLine(); Console.WriteLine("Make sure:"); Console.WriteLine("You are entering a one word answer."); Console.WriteLine("You are only using letters."); Console.WriteLine("You are capitalizing the first letter of the word."); Console.WriteLine(); Console.WriteLine("Try again:"); } } 上运行。我使用$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'),如何解决这个问题?

2 个答案:

答案 0 :(得分: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'],

答案 1 :(得分:0)

我在稍有不同的情况下(处理承诺)遇到了相同的问题,并添加了

.catch(angular.noop)

解决了这个问题。