Модульный тест AngularJs не пройден, потому что Karma не распознает $scope.$ На слушателях в контроллере
Так вот в чем дело. Я исследовал много тем, но не смог найти ничего, связанного с моей ошибкой. Я пытаюсь протестировать мое угловое приложение (сначала я хочу уточнить, что я новичок в unitTesting)
Согласно этому уроку я все настроил, и базовые тесты работают нормально. Но когда я включаю модуль NgMock, мое настоящее угловое приложение и пишу простой тест для проверки метода на одном из моих контроллеров, я получаю следующую stackTrace.
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
e@C:/Users/Pablo/Data/software/workspace/intellij/leadaki-core/public/dashboard/v4/js/angular.min.js:39:154
h/<.instantiate@C:/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 для создания новой области и подачи в.