Я хочу протестировать свой компонент Angular, который синтаксически основан на руководстве по стилю Джона Папы:
'use strict';
angular.module('MyModule')
.component('MyCmpnt', MyCmpnt())
.controller('MyCtrl', MyCtrl);
function MyCmpnt() {
return {
restrict: 'E',
templateUrl: 'myPath/myTemplate.html',
bindings: {
foo: '=',
bar: '<'
},
controller: 'MyCtrl',
controllerAs: 'vm'
};
}
MyCtrl.$inject = ['MyService'];
function MyCtrl (MyService) {
// controller logic
}
Как видите, я хочу внедрить MyService
в контроллер и подсмотреть в функции этого самого сервиса.
Мой тестовый код:
'use strict';
describe('component: MyCmpnt', function () {
var $componentController,
MyService;
beforeEach(module('MyModule'));
beforeEach(module(function ($provide) {
$provide.value('MyService', MyService);
spyOn(MyService, 'serviceFunc').and.callThrough();
}));
beforeEach(inject(function (_$componentController_) {
$componentController = _$componentController_;
}));
it('should initiate the component and define bindings', function () {
var bindings = {
foo: 'baz',
bar: []
};
var ctrl = $componentController('MyCmpnt', null, bindings);
expect(ctrl.foo).toBeDefined();
});
});
Однако эта настройка позволяет мне столкнуться со следующей ошибкой:
TypeError: undefined не является конструктором (оценка '$componentController('MyModule', null, bindings)')
MyModule
— это модуль, состоящий из компонентаMyCmpnt
и соответствующего контроллераMyCtrl
. Что вы имеете в виду? - person DonJuwe   schedule 02.02.2017$componentController('MyModule'...
, а компонента MyModule нет. Это именно то, что говорит сообщение об ошибке. Это MyCmpnt. Не МойМодуль. - person Estus Flask   schedule 02.02.2017$componentController
не определено. Это означает, что инъекция даже не была выполнена. - person DonJuwe   schedule 02.02.2017is not a constructor
означает, что не просто что-то стало неопределенным, но конструктор стал неопределенным. Angular использует конструкторы только для контроллеров иservice
сервисов. Я предлагаю дважды проверить, исправили ли вы это в спецификации, которую вы используете, потому что я не вижу другого разумного объяснения этой ошибки из приведенного выше кода. Если проблема не устранена, рассмотрите возможность предоставления plunk/fiddle, который может воспроизвести эту ошибку. Кстати, у вас есть переменнаяMyService
, не определенная в приведенном выше коде (spyOn(MyService...
выкинет), это означает, что опубликованный код отличается от реального кода. - person Estus Flask   schedule 02.02.2017spyOn(MyService, 'serviceFunc').and.callThrough();
выдает ошибку при запуске в той же функцииbeforeEach()
, что и$provide
. Более того, эта ошибка, кажется, проглатывается репортером PhantomJS. Перемещение шпиона в функциюbeforeEach(inject(function (_$componentController_) {}));
работает. Спасибо за ваши усилия @estus, вы можете опубликовать это как ответ, и я приму его. - person DonJuwe   schedule 02.02.2017$componentController
будет неопределенным (а ошибкаundefined is not a constructor
означает, что это было определено), В любом случае, я бы посоветовал переключиться на Chrome, если у вас есть подозрения, что ошибки подавляются. - person Estus Flask   schedule 02.02.2017