Dies ist für die Arbeit (ich habe die Erlaubnis), so kann ich nicht genauen Code posten.Umgang mit Abhängigkeiten in angularjs Test
Also muss ich Controller eines großen Moduls testen. Das Modul hat eine große Konfigurationsfunktion mit einer Reihe von Controllern für die Logik der verschiedenen Seiten.
Für die eigentliche Anwendung ist es mit Bower geladen, was irritierend ist, da ich mit Karma-Browserify und npm teste. Also die Abhängigkeiten sind ein Durcheinander. Ich muss im Grunde alles importieren, was von bower.json zu package.json geladen wurde.
Das ist mein karma.conf.js:
module.exports = function(config) {
config.set({
basePath: 'resources',
browserify: {
debug: true,
transform: [ 'browserify-shim' ]
},
browsers: [ 'PhantomJS' ],
captureTimeout: 60000,
client: {
mocha: {}
},
files: [
'tests/assist/test.js',
'assets/scripts/libs/logger.min.js'
],
frameworks: [ 'browserify', 'phantomjs-shim', 'mocha', 'chai' ],
port: 8080,
preprocessors: {
'tests/assist/controller.js': [ 'browserify' ]
},
reporters: [ 'mocha', 'coverage' ],
singleRun: true
});
};
So ist der Code darunter meine test.js ist (einige unternehmensspezifische Namen zu entfernen). Auch ich muss angle.mock setzen. oder es wird nicht funktionieren
require('angular');
require('angular-mocks');
//Main module needs these
jQuery = require('jquery');
require('angular-bootstrap');
require('angular-recaptcha');
require('angular-ui-router');
require('ngstorage');
require(**The path to the main module**);
require(**The path to a service it uses**);
require(**The path to a service it uses**);
require(**The path to a service it uses**);
describe('Blah', function() {
beforeEach(angular.mock.module('myApp'));
var $controller;
beforeEach(angular.mock.inject(function(_$controller_) {
$controller = _$controller_;
}));
describe('blahblah', function() {
it('sets loading to true', function() {
var $scope = {};
var controller = $controller('controller', {$scope: $scope});
assert($scope.showLoading === true);
});
});
});
Das Hauptmodul:
(function() {
'use strict';
})();
// Jquery noconflict
jQuery.noConflict();
var myApp = angular.module('myApp', ['ui.router', 'ngStorage', 'vcRecaptcha', 'ui.bootstrap']);
myApp.config(['$stateProvider', '$urlRouterProvider', '$locationProvider', function($stateProvider, $urlRouterProvider, $locationProvider) {
...
}])
.run([blah bunch of dependencies]) {
...
}]);
Der Regler (getrennte fie):
'use strict';
myApp.controller('controller', ['$scope', '$http', '$localStorage', 'service1', 'service2', 'service3',
function ($scope, $http, $localStorage, service1, service2, service3) {
..
}
...
Wie Sie sehen, ich in Abhängigkeit Hölle bin. Ich habe den Beispiel-Test auf der angularen Website zu arbeiten, das Hauptproblem ist mit den Abhängigkeiten und myApp nicht für den Controller sichtbar. "ReferenceError: Variable kann nicht gefunden werden: myApp" in controllern/services
Wenn jemand einen besseren Weg zum Testen hat, bin ich ganz Ohr.
ich nicht unbedingt eine bessere Art und Weise zu testen es so viel wie ich habe einen Vorschlag definiert ist. Angularjs ist nicht dazu gedacht, mit einer Reihe von Controllern geschrieben zu werden, tatsächlich haben sie in Angular2 Controller komplett eliminiert, weil die Leute sie missbraucht haben. Ich schlage vor, auf die Dokumente zurückzublicken und darüber nachzudenken, eine zentralere Route zu wählen. Meine Firma hat kürzlich von den Controllern auf Fabriken und Richtlinien umgestellt und eine wesentliche Verbesserung festgestellt. – Ohjay44
Vielen Dank für Ihre Kommentare. Ich bin nur ein Praktikant, also sollte ich nur eine Codebasis testen, die ich nicht geschrieben habe, also kann ich nicht wirklich schalten usw. Hoffentlich schlägt die Antwort von estus es vor. –