Heim Web-Frontend js-Tutorial So führen Sie einen Unit-Test in der AngularJS Library_AngularJS von JavaScript durch

So führen Sie einen Unit-Test in der AngularJS Library_AngularJS von JavaScript durch

May 16, 2016 pm 03:53 PM
angularjs

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.

201562393334308.png (257×221)

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'
    }
 
  })
}
Nach dem Login kopieren


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
Nach dem Login kopieren

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();
  };
})
Nach dem Login kopieren

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);
  });
});
Nach dem Login kopieren

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);
  });
});
Nach dem Login kopieren

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.

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Die neuesten 5 AngularJS-Tutorials im Jahr 2022, vom Einstieg bis zur Beherrschung Die neuesten 5 AngularJS-Tutorials im Jahr 2022, vom Einstieg bis zur Beherrschung Jun 15, 2017 pm 05:50 PM

Javascript ist eine sehr einzigartige Sprache, was die Organisation des Codes, das Programmierparadigma des Codes und die objektorientierte Theorie betrifft. Die Frage, ob Javascript eine objektorientierte Sprache ist, wird seit langem diskutiert Es gibt offensichtlich schon seit langem eine Antwort. Auch wenn Javascript seit zwanzig Jahren vorherrscht, schauen Sie sich einfach das „Black Horse Cloud Classroom JavaScript Advanced Framework“ an, wenn Sie beliebte Frameworks wie jQuery, Angularjs und sogar React verstehen möchten Design-Video-Tutorial“.

Verwenden Sie PHP und AngularJS, um eine reaktionsfähige Website zu erstellen und ein hochwertiges Benutzererlebnis zu bieten Verwenden Sie PHP und AngularJS, um eine reaktionsfähige Website zu erstellen und ein hochwertiges Benutzererlebnis zu bieten Jun 27, 2023 pm 07:37 PM

Im heutigen Informationszeitalter sind Websites zu einem wichtigen Instrument für Menschen geworden, um Informationen zu erhalten und zu kommunizieren. Eine responsive Website kann sich an verschiedene Geräte anpassen und den Benutzern ein qualitativ hochwertiges Erlebnis bieten, was zu einem Hotspot in der modernen Website-Entwicklung geworden ist. In diesem Artikel erfahren Sie, wie Sie mit PHP und AngularJS eine responsive Website erstellen, um ein qualitativ hochwertiges Benutzererlebnis zu bieten. Einführung in PHP PHP ist eine serverseitige Open-Source-Programmiersprache, die sich ideal für die Webentwicklung eignet. PHP bietet viele Vorteile, z. B. einfache Erlernbarkeit, plattformübergreifende Funktionalität, umfangreiche Toolbibliothek und Entwicklungseffizienz

Erstellen Sie Webanwendungen mit PHP und AngularJS Erstellen Sie Webanwendungen mit PHP und AngularJS May 27, 2023 pm 08:10 PM

Mit der kontinuierlichen Entwicklung des Internets sind Webanwendungen zu einem wichtigen Bestandteil des Informationsaufbaus in Unternehmen und zu einem notwendigen Mittel für Modernisierungsarbeiten geworden. Um die Entwicklung, Wartung und Erweiterung von Webanwendungen zu vereinfachen, müssen Entwickler ein technisches Framework und eine Programmiersprache wählen, die ihren Entwicklungsanforderungen entspricht. PHP und AngularJS sind zwei sehr beliebte Webentwicklungstechnologien. Sie sind serverseitige bzw. clientseitige Lösungen und können die Entwicklungseffizienz und das Benutzererlebnis von Webanwendungen erheblich verbessern. Vorteile von PHPPHP

Wie verwende ich AngularJS in der PHP-Programmierung? Wie verwende ich AngularJS in der PHP-Programmierung? Jun 12, 2023 am 09:40 AM

Mit der Popularität von Webanwendungen erfreut sich das Frontend-Framework AngularJS immer größerer Beliebtheit. AngularJS ist ein von Google entwickeltes JavaScript-Framework, das Sie beim Erstellen von Webanwendungen mit dynamischen Webanwendungsfunktionen unterstützt. Andererseits ist PHP für die Backend-Programmierung eine sehr beliebte Programmiersprache. Wenn Sie PHP für die serverseitige Programmierung verwenden, bringt die Verwendung von PHP mit AngularJS dynamischere Effekte auf Ihre Website.

Erstellen Sie eine einseitige Webanwendung mit Flask und AngularJS Erstellen Sie eine einseitige Webanwendung mit Flask und AngularJS Jun 17, 2023 am 08:49 AM

Mit der rasanten Entwicklung der Webtechnologie ist die Single Page Web Application (SinglePage Application, SPA) zu einem immer beliebter werdenden Webanwendungsmodell geworden. Im Vergleich zu herkömmlichen mehrseitigen Webanwendungen besteht der größte Vorteil von SPA darin, dass die Benutzererfahrung reibungsloser ist und auch der Rechendruck auf dem Server erheblich reduziert wird. In diesem Artikel stellen wir vor, wie man mit Flask und AngularJS ein einfaches SPA erstellt. Flask ist ein leichter Py

Verwenden Sie PHP und AngularJS, um eine Online-Dateiverwaltungsplattform zu entwickeln, die die Dateiverwaltung erleichtert Verwenden Sie PHP und AngularJS, um eine Online-Dateiverwaltungsplattform zu entwickeln, die die Dateiverwaltung erleichtert Jun 27, 2023 pm 01:34 PM

Mit der Popularität des Internets nutzen immer mehr Menschen das Netzwerk, um Dateien zu übertragen und zu teilen. Aus verschiedenen Gründen kann die Verwendung herkömmlicher FTP- und anderer Methoden zur Dateiverwaltung jedoch nicht den Anforderungen moderner Benutzer gerecht werden. Daher ist die Einrichtung einer benutzerfreundlichen, effizienten und sicheren Online-Dateiverwaltungsplattform zu einem Trend geworden. Die in diesem Artikel vorgestellte Online-Dateiverwaltungsplattform basiert auf PHP und AngularJS. Sie kann problemlos Dateien hochladen, herunterladen, bearbeiten, löschen und andere Vorgänge ausführen und bietet eine Reihe leistungsstarker Funktionen wie Dateifreigabe, Suche,

So verwenden Sie PHP und AngularJS für die Frontend-Entwicklung So verwenden Sie PHP und AngularJS für die Frontend-Entwicklung May 11, 2023 pm 05:18 PM

Mit der Popularität und Entwicklung des Internets wird die Front-End-Entwicklung immer wichtiger. Als Frontend-Entwickler müssen wir verschiedene Entwicklungstools und -technologien verstehen und beherrschen. Unter ihnen sind PHP und AngularJS zwei sehr nützliche und beliebte Tools. In diesem Artikel erklären wir, wie Sie diese beiden Tools für die Frontend-Entwicklung verwenden. 1. Einführung in PHP PHP ist eine beliebte serverseitige Open-Source-Skriptsprache. Sie eignet sich für die Webentwicklung und kann auf Webservern und verschiedenen Betriebssystemen ausgeführt werden. Die Vorteile von PHP sind Einfachheit, Geschwindigkeit und Komfort

Einführung in die Grundlagen von AngularJS Einführung in die Grundlagen von AngularJS Apr 21, 2018 am 10:37 AM

Der Inhalt dieses Artikels befasst sich mit der grundlegenden Einführung in AngularJS. Jetzt kann ich ihn mit Ihnen teilen.

See all articles