Directivesのテスト

3189 ワード

テストの目的
  • directiveがビュー/DOMで機能するかどうかをテストします.

  • DirectiveはAngularJSの重要な構成部分(実はカスタムコントロール)です.彼らをテストすることも重要です.directiveをテストするときは、directiveが実行されたときに$scopeまたはDOMに反応するかどうかを見たいはずです.directivesは同じように、設計に依存して、XHRをバックグラウンドにトリガーする可能性がありますが、これはあまりにもかわいいので、directivesをテストするときは、3つの方法で正確性を保証することが望ましいです(結局は汎用的なカスタムコントロールで、恥をかくことはできません).
    ユニットテスト:
    <!-- lang: js -->
    //
    // test/unit/directives/directivesSpec.js
    //
    describe("Unit: Testing Directives", function() {
    
      var $compile, $rootScope;
    
      beforeEach(module('App'));
    
      beforeEach(inject(
        ['$compile','$rootScope', function($c, $r) {
          $compile = $c;
          $rootScope = $r;
        }]
      ));
    
      it("should display the welcome text properly", function() {
        var element = $compile('<div data-app-welcome>User</div>')($rootScope);
        expect(element.html()).to.match(/Welcome/i);
      })
    
    });
    

    Midwayテスト:
    <!-- lang: js -->
    //
    // test/midway/directives/directivesSpec.js
    //
    describe("Midway: Testing Directives", function() {
    
      var tester;
      beforeEach(function() {
        tester = ngMidwayTester('App');
      });
    
      afterEach(function() {
        tester.destroy();
        tester = null;
      });
    
      it("should properly create the youtube listings with the directive in mind", function(done) {
        var $youtube = tester.inject('$appYoutubeSearcher');
    
        var html = '';
        html += '<div data-app-youtube-listings id="app-youtube-listings">';
        html += ' <div data-ng-include="\'templates/partials/youtube_listing_tpl.html\'" data-ng-repeat="video in videos"></div>';
        html += '</div>';
    
        $youtube.query('latest', false, function(q, videos) {
          var scope = tester.viewScope().$new();
          scope.videos = videos;
          var element = tester.compile(html, scope);
          setTimeout(function() {
            var klass = (element.attr('class') || '').toString();
            var hasClass = /app-youtube-listings/.exec(klass);
            expect(hasClass.length).to.equal(1);
    
            var kids = element.children('.app-youtube-listing');
            expect(kids.length > 0).to.equal(true);
            done();
          },1000);
        });
      });
    
    });
    

    E 2 Eテスト:
    <!-- lang: js -->
    //
    // test/e2e/directives/directivesSpec.js
    //
    describe("E2E: Testing Directives", function() {
    
      beforeEach(function() {
        browser().navigateTo('/');
      });
    
      it('should have a working welcome directive apply it\'s logic to the page', function() {
        browser().navigateTo('#!/videos');
        expect(browser().location().path()).toBe("/videos");
        expect(element('#app-welcome-text').html()).toContain('Welcome');
      });
    
      it('should have a working youtube listing directive that goes to the right page when clicked', function() {
        browser().navigateTo('#!/videos');
        element('.app-youtube-listing').click();
        expect(browser().location().path()).toMatch(/\/videos\/.+/);
      });
    
    });