Когда у меня есть один контроллер, подключенный к модулю, я могу использовать mocha, karma, чтобы проверить его успешно. Но когда я добавляю два контроллера в один и тот же модуль, тесты терпят неудачу. Почему это?
У меня есть два контроллера, определенных в одном модуле. Я могу вручную протестировать контроллеры, и они работают.
src/app/itemListController.js
angular.module('lazyLoad', [])
.controller('ItemListController', ['$scope', function ($scope) {
...
}]);
src/app/invoiceController.js
angular.module('lazyLoad', [])
.controller('InvoiceController', ['$scope', function ($scope) {
...
}]);
И 2 единичных теста:
test/app/itemListController.mocha.js
'use strict';
describe('testing movies', function () {
var scope;
var fixture;
beforeEach(module('lazyLoad'));
beforeEach(inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
fixture = $controller('ItemListController', {$scope: scope});
}));
it('....', function() {});
});
test/app/invoiceController.mocha.js
'use strict';
describe('testing movies', function () {
var scope;
var fixture;
beforeEach(module('lazyLoad'));
beforeEach(inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
fixture = $controller('InvoiceController', {$scope: scope});
}));
it('....', function() {});
});
Я получил:
PhantomJS 1.9.8 (Mac OS X 0.0.0) testing movies "before each" hook: workFn FAILED
the object {
"line": 1761
"message": "[ng:areq] Argument 'ItemListController' is not a function, got undefined
http://errors.angularjs.org/1.4.1/ng/areq?p0=ItemListController&p1=not%20a%20function%2C%20got%20undefined"
"name": "Error"
Теперь, если я изменю имя модуля для invoiceController.js и invoiceController.mocha.js, чтобы сказать invoiceM, тогда оба теста работают.
Я должен делать что-то неправильно...
Вы определяете свои модули дважды. Когда вы используете скобки []
для передачи пустых зависимостей, вы фактически создаете модуль и заменяете старый, если он существует с тем же именем. Что вам нужно сделать:
// Create the module, maybe in a separate place.
angular.module('lazyLoad', []);
// Attach controllers to that module:
angular.module('lazyLoad') // HEY! SEE THIS? NO BRACKETS.
.controller('ItemListController', ...);]
angular.module('lazyLoad') // HEY! SEE THIS? NO BRACKETS.
.controller('InvoiceController' ...);