2016-03-25 9 views
0

Итак, вот что. Я изучал много потоков, но не мог найти ничего, связанного с моей ошибкой. Я пытаюсь проверить свое угловое приложение (сначала хочу уточнить, что я являюсь любопытным новичком в UnitTesting)

Согласно this tutorial Я настроил все, и основные тесты работают нормально. Но когда я включаю модуль NgMock, мое реальное угловое приложение и пишу простой тест для тестирования метода на одном из моих контроллеров, я получаю следующий стек.

grunt karma:dev 
Running "karma:dev" (karma) task 
25 03 2016 20:41:24.754:INFO [karma]: Karma v0.13.22 server started at http://localhost:9876/ 
25 03 2016 20:41:24.763:INFO [launcher]: Starting browser Chrome 
25 03 2016 20:41:24.771:INFO [launcher]: Starting browser Firefox 
25 03 2016 20:41:28.747:INFO [Chrome 49.0.2623 (Windows 10 0.0.0)]: Connected on socket /#yRHoLsbEaJWHNtSDAAAA with id 47988329 
Chrome 49.0.2623 (Windows 10 0.0.0) Unit tests del CRM: Create new message Should create a text message with the correct structure FAILED 
     TypeError: $scope.$on is not a function 
      at new <anonymous> (C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/controllers/view-conversations.js:248:12) 
      at e (C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/angular.min.js:39:156) 
      at Object.instantiate (C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/angular.min.js:39:273) 
      at C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/angular.min.js:80:228 
      at C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/angular-mocks.js:1848:12 
      at Context.<anonymous> (C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/test/frontend/leadaki-app-tests.js:44:30) 
Chrome 49.0.2623 (Windows 10 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.087 secs/0.024 secs) 
Firefox 45.0.0 (Windows 10 0.0.0) Unit tests del CRM: Create new message Should create a text message with the correct structure FAILED 
     $scope.$on is not a function 
     @C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/controllers/view-conversations.js:248:5 
     [email protected]:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/angular.min.js:39:154 
     h/<[email protected]:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/angular.min.js:39:273 
     Xe/this.$get</<@C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/angular.min.js:80:226 
     angular.mock.$ControllerDecorator</<@C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/angular-mocks.js:1848:12 
     @C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/test/frontend/leadaki-app-tests.js:44:30 

Chrome 49.0.2623 (Windows 10 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.087 secs/0.024 secs) 
Firefox 45.0.0 (Windows 10 0.0.0): Executed 1 of 1 (1 FAILED) ERROR (0.053 secs/0.011 secs) 
Warning: Task "karma:dev" failed. Use --force to continue. 

Aborted due to warnings. 

Похоже, что «макет» рамка, что ngMock генерирует не принимает иметь слушатель или что-то подобное.

Есть ли у кого-нибудь намек на ошибку?

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

Спасибо, продвинутый!

describe('Unit tests del CRM: ', function() { 

    before(function() { 
     if (window.__html__) { 
      document.body.innerHTML = window.__html__['test/index.html']; 
     } 
    }); 

    beforeEach(angular.mock.module('appCliengo')); 

    var $controller; 
    var $rootScope; 

    beforeEach(angular.mock.inject(function(_$rootScope_, _$controller_){ 
     $rootScope = _$rootScope_; 
     $controller = _$controller_; 
    })); 

    describe('Create new message', function() { 
     it('Should create a text message with the correct structure', function() { 
      var $scope = {}; 
      var controller = $controller('Contacts.viewConversation', { $scope: $scope }); 

      var messageBody = 'Hola, me gustaria comprar un auto'; 
      var newTextMessage = $scope.createMessage('text/plain', '123456789', 'user', 'abcdefghijk', messageBody); 

      expect(newTextMessage.body).to.equal(messageBody); 
     }); 
    }); 
}); 

ответ

1

Трудно сказать, не глядя на вашу точную настройку, но вы создали объект области для ввода в ваш контроллер?

Много времени, вы можете подделать его только с помощью объекта $ rootScope:

beforeEach(angular.mock.inject($injector => { 
    $controller = $injector.get('$controller'); 
    rootScope = $injector.get('$rootScope'); 
})); 

... test code ... 

let controller = $controller('UserController', {$scope: rootScope}); 

... do stuff with controller ... 

Однако, вы можете также использовать rootScope, чтобы создать новую область и корма, что в

+0

Если. вы смотрите на код, вы привязываете переменную $ scope к параметру $ scope вашего контроллера. Это означает, что при попытке вызвать $ scope. $ On вы действительно пытаетесь вызвать {}. $ On. Интерпретатор правильно говорит вам, что там ничего нет. Вы можете использовать $ scope: $ rootScope или сделать $ scope реальным объектом области с помощью: $ scope = $ rootScope. $ New(); –

+0

Спасибо! Теперь работает! –