ホームページ ウェブフロントエンド jsチュートリアル JavaScript の AngularJS で単体テストを行う方法 Library_AngularJS

JavaScript の AngularJS で単体テストを行う方法 Library_AngularJS

May 16, 2016 pm 03:53 PM
angularjs

開発者は皆、開発プロジェクトにおいて単体テストが非常に有益であることに同意しています。これらはコードの品質を確保するのに役立ち、それによってリファクタリングが必要な場合でも開発の安定性と信頼性が高まります。

201562393334308.png (257×221)

テスト駆動開発フローチャート

AngularJS のコードのテスト容易性が高いという主張は確かに合理的です。このドキュメントにリストされているエンドツーエンドのテスト例だけでも、これを説明できます。 AngularJS のようなプロジェクトでは、単体テストは簡単だと言われていますが、それをうまく行うのは簡単ではありません。公式ドキュメントには詳細な例が記載されていますが、実際のアプリケーションでは依然として非常に困難です。ここでは簡単に操作方法を説明します。

インスタントカルマ

Karma は、JavaScript 用に Angular チームによって開発されたテスト実行フレームワークです。テスト タスクを簡単に自動化し、面倒な手動操作 (回帰テスト セットやターゲット テストの依存関係の読み込みなど) を置き換えます。Karma と Angular のコラボレーションは、ピーナッツ バターとゼリーのようなものです。

Karma で構成ファイルを定義して起動するだけで、予期されるテスト環境でテスト ケースが自動的に実行されます。関連するテスト環境を構成ファイルで指定できます。 angular-seed は、私が強くお勧めするソリューションであり、すぐに実装できます。私の最近のプロジェクトにおける Karma の構成は次のとおりです:

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'
    }
 
  })
}
ログイン後にコピー


これは angular-seed のデフォルト設定に似ていますが、次の違いがあります:

  • ジャンプするたびに新しいブラウザウィンドウを開く必要がないように、ブラウザを Chrome から PhantomJS に変更する必要がありますが、OSX システムではウィンドウ遅延が発生します。したがって、プラグインとブラウザの設定が変更されました。
  • 私のアプリケーションは Google の Recaptcha サービスを参照する必要があるため、依存する recaptcha_ajax.js という小さなファイルを追加しました。この小さな構成は、Karma の構成ファイルにコード行を追加するだけで簡単です。

autoWatch は非常に優れた設定で、ファイルが変更されたときに Karma が自動的にテスト ケースに戻るようにします。 Karma は次のようにインストールできます:

npm install karma
ログイン後にコピー

angular-seed は、Karma テストをトリガーするための簡単なスクリプト inscripts/test.sh を提供します。


Jasmine を使用してテスト ケースを設計する

ほとんどのリソースは、動作駆動型開発モデルを備えた JavaScript テスト フレームワークである Jasmine を使用して Angular の単体テスト ケースを設計するときにすでに利用可能です。

これが次に話したいことです。

AngularJS コントローラーの単体テストを行う場合は、Angular の依存関係注入を使用できます。 依存関係注入 この関数は、テスト シナリオでコントローラーに必要なサービス バージョンをインポートし、期待される結果が正しいかどうかもチェックします。たとえば、次のコントローラを定義して、移動する必要があるタブを強調表示します:

app.controller('NavCtrl', function($scope, $location) {
  $scope.isActive = function(route) {
    return route === $location.path();
  };
})
ログイン後にコピー

isActive メソッドをテストしたい場合はどうすればよいですか? $locationservice 変数が期待値を返し、メソッドが期待値を返すかどうかを確認します。したがって、テストの説明では、テスト中に必要な制御されたバージョンを保存し、必要に応じて対応するコントローラーにそれを挿入するローカル変数を定義します。次に、実際のテストケースにアサーションを追加して、実際の結果が正しいかどうかを検証します。全体のプロセスは次のとおりです:

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);
  });
});
ログイン後にコピー

基本構造全体を使用して、さまざまなタイプのテストを設計できます。このテスト シナリオではローカル環境を使用してコントローラーを呼び出すため、さらに属性を追加し、これらの属性をクリアするメソッドを実行して、属性がクリアされたかどうかを確認することもできます。

$httpBackend はクールです

それでは、$httpservice を呼び出してサーバーにデータをリクエストまたは送信する場合はどうなるでしょうか?幸いなことに、Angular は

を提供します。

$httpBackend のモックメソッド。このようにして、サーバーの応答コンテンツをカスタマイズしたり、サーバーの応答結果が単体テストでの期待と一致していることを確認したりできます。

具体的な詳細は次のとおりです:

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);
  });
});
ログイン後にコピー

ご覧のとおり、beforeEach の呼び出しは実際には非常に似ています。唯一の違いは、$httpBackend を直接取得するのではなく、インジェクターから取得することです。それでも、さまざまなテストを作成すると、明らかな違いがいくつかあります。まず、各ユースケースの実行後に $httpBackend に明らかな異常なリクエストがないことを保証する afterEachcall メソッドがあります。テスト シナリオの設定と $httpBackend メソッドのアプリケーションを見ると、あまり直感的ではない点がいくつかあることがわかります。

実際、$httpBackend を呼び出す方法はシンプルで明確ですが、それだけでは十分ではありません。実際のテストでは、$scope に値を渡すメソッドで呼び出しを $scope.runTest メソッドにカプセル化する必要があります。 .$適用します。こうすることで、$digest がトリガーされた後にのみ HTTP リクエストを処理できます。ご覧のとおり、$httpBackend は、$httpBackend.flush() メソッドを呼び出すまで解析されません。これにより、呼び出し中に返された結果が正しいかどうかを確認できます (上記の例では、コントローラーの $scope.flush)。 parseOriginalUrlStatusproperty プロパティは呼び出し元に渡されるため、リアルタイムで監視できます)

次の数行のコードは、呼び出し中に $scopethat 属性を検出するアサーションです。クールですよね?

ヒント: 一部の単体テストでは、ユーザーは変数として $ を付けずにスコープをマークすることに慣れています。これは Angular ドキュメントでは必須でも強調されているわけでもありませんが、読みやすさと一貫性を向上させるために $scopelike を使用しています。

結論

これは私にとって自然なことの 1 つかもしれませんが、Angular で単体テストの書き方を学ぶことは、最初は私にとって間違いなく非常に苦痛でした。開始方法に関する私の理解の多くは、インターネット上のさまざまなブログ投稿やリソースのつぎはぎから得たものであり、実際に一貫した明確なベスト プラクティスはなく、むしろ自然に思いついたランダムな選択によって得られたものであることがわかりました。 Angular と Jasmine の使用方法のすべての奇妙でユニークな機能を理解する必要はなく、ただコードを書きたいだけで苦労している人を助けるために、私が最終的に完成したものについてのドキュメントを提供したいと思いました。そこで、この記事が少しでもお役に立てれば幸いです。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

入門から習得まで、2022 年の最新 5 つの angularjs チュートリアル 入門から習得まで、2022 年の最新 5 つの angularjs チュートリアル Jun 15, 2017 pm 05:50 PM

Javascript は、コードの構成、コードのプログラミング パラダイム、およびオブジェクト指向理論の点で非常にユニークな言語です。しかし、JavaScript が 20 年間主流であったとはいえ、jQuery、Angularjs、さらには React などの人気のあるフレームワークを理解したい場合は、「Black Horse Cloud Classroom JavaScript Advanced Framework」を見てください。デザインビデオチュートリアル」。

PHP と AngularJS を使用して応答性の高い Web サイトを構築し、高品質のユーザー エクスペリエンスを提供します PHP と AngularJS を使用して応答性の高い Web サイトを構築し、高品質のユーザー エクスペリエンスを提供します Jun 27, 2023 pm 07:37 PM

今日の情報化時代において、ウェブサイトは人々が情報を入手し、コミュニケーションを図るための重要なツールとなっています。レスポンシブな Web サイトはさまざまなデバイスに適応し、ユーザーに高品質のエクスペリエンスを提供できます。これは、現代の Web サイト開発のホットスポットとなっています。この記事では、PHP と AngularJS を使用して応答性の高い Web サイトを構築し、高品質のユーザー エクスペリエンスを提供する方法を紹介します。 PHP の概要 PHP は、Web 開発に最適なオープンソースのサーバー側プログラミング言語です。 PHP には、学びやすさ、クロスプラットフォーム、豊富なツール ライブラリ、開発効率など、多くの利点があります。

PHP と AngularJS を使用して Web アプリケーションを構築する PHP と AngularJS を使用して Web アプリケーションを構築する May 27, 2023 pm 08:10 PM

インターネットの継続的な発展に伴い、Web アプリケーションは企業情報構築の重要な部分となり、最新化作業に必要な手段となりました。 Web アプリケーションの開発、保守、拡張を容易にするために、開発者は開発ニーズに合った技術フレームワークとプログラミング言語を選択する必要があります。 PHP と AngularJS は非常に人気のある 2 つの Web 開発テクノロジであり、それぞれサーバー側とクライアント側のソリューションであり、これらを組み合わせて使用​​すると、Web アプリケーションの開発効率とユーザー エクスペリエンスを大幅に向上させることができます。 PHPPHPの利点

Flask と AngularJS を使用してシングルページ Web アプリケーションを構築する Flask と AngularJS を使用してシングルページ Web アプリケーションを構築する Jun 17, 2023 am 08:49 AM

Web テクノロジーの急速な発展に伴い、シングル ページ Web アプリケーション (SinglePage Application、SPA) は、Web アプリケーション モデルとしてますます人気が高まっています。従来の複数ページの Web アプリケーションと比較して、SPA の最大の利点は、ユーザー エクスペリエンスがよりスムーズであり、サーバーのコンピューティング負荷も大幅に軽減されることです。この記事では、FlaskとAngularJSを使って簡単なSPAを構築する方法を紹介します。 Flask は軽量の Py です

PHP と AngularJS を使用してオンライン ファイル管理プラットフォームを開発し、ファイル管理を容易にする PHP と AngularJS を使用してオンライン ファイル管理プラットフォームを開発し、ファイル管理を容易にする Jun 27, 2023 pm 01:34 PM

インターネットの普及に伴い、ネットワークを使用してファイルを転送したり共有したりする人が増えています。ただし、さまざまな理由により、FTP などの従来の方法をファイル管理に使用しても、現代のユーザーのニーズを満たすことができません。したがって、使いやすく、効率的で安全なオンライン ファイル管理プラットフォームを確立することがトレンドになっています。この記事で紹介するオンライン ファイル管理プラットフォームは、PHP と AngularJS をベースにしており、ファイルのアップロード、ダウンロード、編集、削除などの操作を簡単に実行でき、ファイル共有、検索、検索などの一連の強力な機能を提供します。

PHP プログラミングで AngularJS を使用するにはどうすればよいですか? PHP プログラミングで AngularJS を使用するにはどうすればよいですか? Jun 12, 2023 am 09:40 AM

Web アプリケーションの人気に伴い、フロントエンド フレームワーク AngularJS の人気も高まっています。 AngularJS は、Google が開発した JavaScript フレームワークで、動的な Web アプリケーション機能を備えた Web アプリケーションの構築に役立ちます。一方、バックエンド プログラミングの場合、PHP は非常に人気のあるプログラミング言語です。サーバーサイド プログラミングに PHP を使用している場合、PHP と AngularJS を使用すると、Web サイトにさらに動的な効果がもたらされます。

フロントエンド開発に PHP と AngularJS を使用する方法 フロントエンド開発に PHP と AngularJS を使用する方法 May 11, 2023 pm 05:18 PM

インターネットの普及と発展に伴い、フロントエンド開発の重要性がますます高まっています。フロントエンド開発者として、私たちはさまざまな開発ツールとテクノロジーを理解し、習得する必要があります。その中でも、PHP と AngularJS は非常に便利で人気のあるツールです。この記事では、これら 2 つのツールをフロントエンド開発に使用する方法を説明します。 1. PHP の概要 PHP は、人気のあるオープン ソースのサーバー側スクリプト言語であり、Web 開発に適しており、Web サーバーやさまざまなオペレーティング システム上で実行できます。 PHP の利点は、シンプルさ、スピード、利便性です。

AngularJS の基本の紹介 AngularJS の基本の紹介 Apr 21, 2018 am 10:37 AM

この記事の内容は AngularJS の基本的な入門に関するもので、必要な友人に共有します。

See all articles