0

Я использую жасмин, чтобы написать единичный тест для контроллера, где я должен проверить, работает ли функция на $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), как это можно исправить?

+0

AngularJS версии? – tasseKATT

+0

@tasseKATT это угловая 1.5.9 –

+0

Такая же ошибка, если вы удалите инъекцию '$ mdDialog' и' $ state' в контроллер? – tasseKATT

ответ

1

У меня была такая же проблема. (Только с «Возможно необработанным отказом: en thrown») Эта проблема вызвана дизайном углового перевода, я предполагаю, что вы используете это в своем приложении. Посмотрите на следующую ссылку: How do unit test with angular-translate

Существует несколько подходов к решению этой проблемы. Я использовал тот, который извлекает конфигурацию переводчика в собственный файл и в карме я исключаю этот.

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'],