2016-06-03 21 views
0

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.

+0

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

+0

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. –

Antwort

2

Dies ist nicht über Abhängigkeit Hölle, nicht über das Testen auch.

Der Code scheint sich auf myApp globale Variable zu verlassen, dies ist genau das Gegenteil von dem, was eckige Module sind.

myApp soll eine lokale Variable sein, die dynamisch in jedem Funktionsumfang

(function() { 

var myApp = angular.module('myApp', [...]); 
... 

})(); 

(function() { 

var myApp = angular.module('myApp'); 
myApp.controller('controller', ...) 
... 

})(); 
+0

wäre es auch nicht korrekt, dass du deinen Controller noch in einer anderen js-Datei haben könntest, wenn du 10 Controller hättest und diese etwas aufräumen wolltest. Sie würden Ihr Modul nur durch eckige statt durch eine globale Variable referenzieren, wie Sie oben gesagt haben. Beispiel: angular.module ('myApp'). Controller (.......) – Ohjay44

+0

Bitte ignorieren Sie diesen Kommentar –

+0

@ Ohjay44 Sicher, es ist eine Frage der Präferenz. Es kann für die Definition eines einzelnen Controllers überflüssig sein, aber für die Stilkonsistenz von Vorteil sein. – estus