


So führen Sie einen Unit-Test in der AngularJS Library_AngularJS von JavaScript durch
Entwickler sind sich alle einig, dass Unit-Tests in Entwicklungsprojekten sehr vorteilhaft sind. Sie helfen Ihnen, die Qualität Ihres Codes sicherzustellen und sorgen so für eine stabilere Entwicklung und mehr Vertrauen, selbst wenn eine Umgestaltung erforderlich ist.
Testgetriebenes Entwicklungsflussdiagramm
AngularJS‘ Codeanspruch einer höheren Testbarkeit ist in der Tat berechtigt. Allein die im Dokument aufgeführten End-to-End-Testbeispiele können dies veranschaulichen. Obwohl Unit-Tests bei Projekten wie AngularJS einfach sein sollen, ist es nicht einfach, sie gut durchzuführen. Obwohl die offizielle Dokumentation detaillierte Beispiele enthält, ist dies in meiner tatsächlichen Anwendung immer noch eine große Herausforderung. Hier werde ich einfach demonstrieren, wie ich es bediene.
Sofortiges Karma
Karma ist ein Testlauf-Framework, das vom Angular-Team für JavaScript entwickelt wurde. Es automatisiert problemlos Testaufgaben und ersetzt mühsame manuelle Vorgänge (z. B. Regressionstestsätze oder das Laden von Zieltestabhängigkeiten). Die Zusammenarbeit zwischen Karma und Angular ist wie Erdnussbutter und Gelee.
Sie müssen nur die Konfigurationsdatei in Karma definieren, um es zu starten, und dann führt es automatisch Testfälle in der erwarteten Testumgebung aus. Die entsprechende Testumgebung können Sie in der Konfigurationsdatei angeben. angular-seed ist eine Lösung, die ich wärmstens empfehlen kann und die schnell implementiert werden kann. Die Konfiguration von Karma in meinem letzten Projekt ist wie folgt:
module.exports = function(config) { config.set({ basePath: '../', files: [ 'app/lib/angular/angular.js', 'app/lib/angular/angular-*.js', 'app/js/**/*.js', 'test/lib/recaptcha/recaptcha_ajax.js', 'test/lib/angular/angular-mocks.js', 'test/unit/**/*.js' ], exclude: [ 'app/lib/angular/angular-loader.js', 'app/lib/angular/*.min.js', 'app/lib/angular/angular-scenario.js' ], autoWatch: true, frameworks: ['jasmine'], browsers: ['PhantomJS'], plugins: [ 'karma-junit-reporter', 'karma-chrome-launcher', 'karma-firefox-launcher', 'karma-jasmine', 'karma-phantomjs-launcher' ], junitReporter: { outputFile: 'test_out/unit.xml', suite: 'unit' } }) }
Dies ähnelt der Standardkonfiguration von Angular-Seed, weist jedoch die folgenden Unterschiede auf:
- Es ist notwendig, den Browser von Chrome auf PhantomJS umzustellen, damit nicht bei jedem Sprung ein neues Browserfenster geöffnet werden muss, es kommt jedoch zu einer Fensterverzögerung im OSX-System. Daher wurden die Plugin- und Browsereinstellungen geändert.
- Da meine Anwendung auf den Recaptcha-Dienst von Google verweisen muss, habe ich die abhängige kleine Datei recaptcha_ajax.js hinzugefügt. Diese kleine Konfiguration ist so einfach wie das Hinzufügen einer Codezeile zur Karma-Konfigurationsdatei.
autoWatch ist eine wirklich coole Einstellung, mit der Karma bei Dateiänderungen automatisch zu Ihren Testfällen zurückkehren kann. Sie können Karma wie folgt installieren:
npm install karma
Angular-Seed bietet ein einfaches Skript inscripts/test.sh zum Auslösen von Karma-Tests.
Entwerfen Sie Testfälle mit Jasmine
Die meisten Ressourcen sind bereits verfügbar, wenn Sie Unit-Testfälle für Angular mit Jasmine entwerfen – einem JavaScript-Testframework mit einem verhaltensgesteuerten Entwicklungsmodell.
Darüber möchte ich als nächstes sprechen.
Wenn Sie den AngularJS-Controller einem Unit-Test unterziehen möchten, können Sie die Abhängigkeitsinjektion von Angular verwenden. Abhängigkeitsinjektion Die Funktion importiert die vom Controller benötigte Serviceversion im Testszenario und prüft außerdem, ob die erwarteten Ergebnisse korrekt sind . Ich habe diesen Controller beispielsweise so definiert, dass er die Registerkarte hervorhebt, zu der navigiert werden muss:
app.controller('NavCtrl', function($scope, $location) { $scope.isActive = function(route) { return route === $location.path(); }; })
Was würde ich tun, wenn ich die isActive-Methode testen möchte? Ich überprüfe, ob die Variable $locationservice den erwarteten Wert zurückgibt und ob die Methode den erwarteten Wert zurückgibt. Daher werden wir in unserer Testbeschreibung lokale Variablen definieren, um die während des Tests erforderliche kontrollierte Version zu speichern und sie bei Bedarf in den entsprechenden Controller einzuspeisen. Anschließend werden wir im eigentlichen Testfall Behauptungen hinzufügen, um zu überprüfen, ob die tatsächlichen Ergebnisse korrekt sind. Der gesamte Vorgang läuft wie folgt ab:
describe('NavCtrl', function() { var $scope, $location, $rootScope, createController; beforeEach(inject(function($injector) { $location = $injector.get('$location'); $rootScope = $injector.get('$rootScope'); $scope = $rootScope.$new(); var $controller = $injector.get('$controller'); createController = function() { return $controller('NavCtrl', { '$scope': $scope }); }; })); it('should have a method to check if the path is active', function() { var controller = createController(); $location.path('/about'); expect($location.path()).toBe('/about'); expect($scope.isActive('/about')).toBe(true); expect($scope.isActive('/contact')).toBe(false); }); });
Mithilfe der gesamten Grundstruktur können Sie verschiedene Arten von Tests entwerfen. Da unser Testszenario die lokale Umgebung zum Aufrufen des Controllers verwendet, können Sie auch einige weitere Attribute hinzufügen und dann eine Methode zum Löschen dieser Attribute ausführen und dann überprüfen, ob die Attribute gelöscht wurden.
$httpBackendIs Cool
Was passiert also, wenn Sie $httpservice aufrufen, um Daten anzufordern oder an den Server zu senden? Glücklicherweise bietet Angular ein
Mock-Methode von $httpBackend. Auf diese Weise können Sie den Antwortinhalt des Servers anpassen oder sicherstellen, dass die Antwortergebnisse des Servers mit den Erwartungen im Komponententest übereinstimmen.
Die spezifischen Details lauten wie folgt:
describe('MainCtrl', function() { var $scope, $rootScope, $httpBackend, $timeout, createController; beforeEach(inject(function($injector) { $timeout = $injector.get('$timeout'); $httpBackend = $injector.get('$httpBackend'); $rootScope = $injector.get('$rootScope'); $scope = $rootScope.$new(); var $controller = $injector.get('$controller'); createController = function() { return $controller('MainCtrl', { '$scope': $scope }); }; })); afterEach(function() { $httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest(); }); it('should run the Test to get the link data from the go backend', function() { var controller = createController(); $scope.urlToScrape = 'success.com'; $httpBackend.expect('GET', '/slurp?urlToScrape=http:%2F%2Fsuccess.com') .respond({ "success": true, "links": ["http://www.google.com", "http://angularjs.org", "http://amazon.com"] }); // have to use $apply to trigger the $digest which will // take care of the HTTP request $scope.$apply(function() { $scope.runTest(); }); expect($scope.parseOriginalUrlStatus).toEqual('calling'); $httpBackend.flush(); expect($scope.retrievedUrls).toEqual(["http://www.google.com", "http://angularjs.org", "http://amazon.com"]); expect($scope.parseOriginalUrlStatus).toEqual('waiting'); expect($scope.doneScrapingOriginalUrl).toEqual(true); }); });
Wie Sie sehen können, ist es bei jedem Aufruf tatsächlich sehr ähnlich. Der einzige Unterschied besteht darin, dass wir $httpBackend vom Injektor erhalten, anstatt es direkt zu erhalten. Dennoch gibt es einige offensichtliche Unterschiede bei der Erstellung verschiedener Tests. Zunächst einmal wird es eine afterEachcall-Methode geben, um sicherzustellen, dass $httpBackend nach jeder Anwendungsfallausführung keine offensichtlichen abnormalen Anforderungen hat. Schaut man sich die Einstellungen des Testszenarios und die Anwendung der $httpBackend-Methode an, stellt man fest, dass es einige Dinge gibt, die nicht so intuitiv sind.
Tatsächlich ist die Methode zum Aufrufen von $httpBackend einfach und klar, reicht aber nicht aus – wir müssen den Aufruf in die Methode $scope.runTest im eigentlichen Test in der Methode zur Übergabe des Werts an $scope einkapseln .$anwenden. Auf diese Weise kann die HTTP-Anfrage erst verarbeitet werden, nachdem $digest ausgelöst wurde. Wie Sie sehen, wird $httpBackend erst analysiert, wenn wir die Methode $httpBackend.flush() aufrufen. Dadurch wird sichergestellt, dass wir während des Aufrufs überprüfen können, ob das zurückgegebene Ergebnis korrekt ist (im obigen Beispiel der $scope des Controllers). Die parseOriginalUrlStatusproperty-Eigenschaft wird an den Aufrufer übergeben, sodass wir sie in Echtzeit überwachen können)
Die nächsten Codezeilen sind Behauptungen, die das Attribut $scopethat während des Aufrufs erkennen. Cool, oder?
Tipp: Bei einigen Unit-Tests sind Benutzer daran gewöhnt, Bereiche ohne $ als Variablen zu markieren. Dies ist in der Angular-Dokumentation weder zwingend erforderlich noch wird es überbetont, aber ich verwende $scopelike, um die Lesbarkeit und Konsistenz zu verbessern.
Fazit
Vielleicht ist das eines dieser Dinge, die für mich ganz natürlich sind, aber das Schreiben von Unit-Tests in Angular zu lernen war für mich anfangs definitiv ziemlich schmerzhaft. Ich habe herausgefunden, dass ein Großteil meines Verständnisses, wie man anfängt, aus einem Flickenteppich aus verschiedenen Blogbeiträgen und Ressourcen im Internet stammte, ohne wirklich konsistente oder klare Best Practices, sondern eher durch zufällige Entscheidungen, die ganz natürlich kamen. Ich wollte eine Dokumentation dessen bereitstellen, was ich letztendlich herausgefunden habe, um anderen zu helfen, die möglicherweise Schwierigkeiten haben, weil sie einfach nur Code schreiben möchten, anstatt all die seltsamen und einzigartigen Funktionen der Angular- und Jasmine-Nutzung verstehen zu müssen. Daher hoffe ich, dass dieser Artikel Ihnen hilfreich sein kann.

Unterschiedliche JavaScript -Motoren haben unterschiedliche Auswirkungen beim Analysieren und Ausführen von JavaScript -Code, da sich die Implementierungsprinzipien und Optimierungsstrategien jeder Engine unterscheiden. 1. Lexikalanalyse: Quellcode in die lexikalische Einheit umwandeln. 2. Grammatikanalyse: Erzeugen Sie einen abstrakten Syntaxbaum. 3. Optimierung und Kompilierung: Generieren Sie den Maschinencode über den JIT -Compiler. 4. Führen Sie aus: Führen Sie den Maschinencode aus. V8 Engine optimiert durch sofortige Kompilierung und versteckte Klasse.

Zu den Anwendungen von JavaScript in der realen Welt gehören die serverseitige Programmierung, die Entwicklung mobiler Anwendungen und das Internet der Dinge. Die serverseitige Programmierung wird über node.js realisiert, die für die hohe gleichzeitige Anfrageverarbeitung geeignet sind. 2. Die Entwicklung der mobilen Anwendungen erfolgt durch reaktnative und unterstützt die plattformübergreifende Bereitstellung. 3.. Wird für die Steuerung von IoT-Geräten über die Johnny-Five-Bibliothek verwendet, geeignet für Hardware-Interaktion.

Ich habe eine funktionale SaaS-Anwendung mit mehreren Mandanten (eine EdTech-App) mit Ihrem täglichen Tech-Tool erstellt und Sie können dasselbe tun. Was ist eine SaaS-Anwendung mit mehreren Mietern? Mit Multi-Tenant-SaaS-Anwendungen können Sie mehrere Kunden aus einem Sing bedienen

Dieser Artikel zeigt die Frontend -Integration mit einem Backend, das durch die Genehmigung gesichert ist und eine funktionale edtech SaaS -Anwendung unter Verwendung von Next.js. erstellt. Die Frontend erfasst Benutzerberechtigungen zur Steuerung der UI-Sichtbarkeit und stellt sicher, dass API-Anfragen die Rollenbasis einhalten

JavaScript ist die Kernsprache der modernen Webentwicklung und wird für seine Vielfalt und Flexibilität häufig verwendet. 1) Front-End-Entwicklung: Erstellen Sie dynamische Webseiten und einseitige Anwendungen durch DOM-Operationen und moderne Rahmenbedingungen (wie React, Vue.js, Angular). 2) Serverseitige Entwicklung: Node.js verwendet ein nicht blockierendes E/A-Modell, um hohe Parallelitäts- und Echtzeitanwendungen zu verarbeiten. 3) Entwicklung von Mobil- und Desktop-Anwendungen: Die plattformübergreifende Entwicklung wird durch reaktnative und elektronen zur Verbesserung der Entwicklungseffizienz realisiert.

Zu den neuesten Trends im JavaScript gehören der Aufstieg von Typenkripten, die Popularität moderner Frameworks und Bibliotheken und die Anwendung der WebAssembly. Zukunftsaussichten umfassen leistungsfähigere Typsysteme, die Entwicklung des serverseitigen JavaScript, die Erweiterung der künstlichen Intelligenz und des maschinellen Lernens sowie das Potenzial von IoT und Edge Computing.

JavaScript ist der Eckpfeiler der modernen Webentwicklung. Zu den Hauptfunktionen gehören eine ereignisorientierte Programmierung, die Erzeugung der dynamischen Inhalte und die asynchrone Programmierung. 1) Ereignisgesteuerte Programmierung ermöglicht es Webseiten, sich dynamisch entsprechend den Benutzeroperationen zu ändern. 2) Die dynamische Inhaltsgenerierung ermöglicht die Anpassung der Seiteninhalte gemäß den Bedingungen. 3) Asynchrone Programmierung stellt sicher, dass die Benutzeroberfläche nicht blockiert ist. JavaScript wird häufig in der Webinteraktion, der einseitigen Anwendung und der serverseitigen Entwicklung verwendet, wodurch die Flexibilität der Benutzererfahrung und die plattformübergreifende Entwicklung erheblich verbessert wird.

Python eignet sich besser für Datenwissenschaft und maschinelles Lernen, während JavaScript besser für die Entwicklung von Front-End- und Vollstapel geeignet ist. 1. Python ist bekannt für seine prägnante Syntax- und Rich -Bibliotheks -Ökosystems und ist für die Datenanalyse und die Webentwicklung geeignet. 2. JavaScript ist der Kern der Front-End-Entwicklung. Node.js unterstützt die serverseitige Programmierung und eignet sich für die Entwicklung der Vollstapel.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Dreamweaver Mac
Visuelle Webentwicklungstools

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

SAP NetWeaver Server-Adapter für Eclipse
Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

VSCode Windows 64-Bit-Download
Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

PHPStorm Mac-Version
Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool