2013-09-24 7 views
23

Ich versuche zu lernen, wie Unit Tests für AngularJS zu schreiben. Ich begann zu Beginn, mitUnit testet die Config-Phase in AngularJS

angular.module(...).config(...)

Ich will testen, was in Config ist. Hier ist, wie die relevanten Teile wie folgt aussehen:

angular.module('ogApp', ['ngCookies','ui.router','ogControllers','ogServices','ogDirectives','ogMetricsData']) 

.config([ 
    '$stateProvider', '$locationProvider', 
    function ($stateProvider, $locationProvider) { 
    $stateProvider. 
     state('login', { 
     templateUrl: 'connect.html' 
     }).state('addViews', { 
     templateUrl: 'add-views.html' 
     }).state('dashboard', { 
     templateUrl: 'dashboard.html' 
     }); 
    $locationProvider. 
     html5Mode(true). 
     hashPrefix('!'); 
    } 
]); 

ich die einfachste Art und Weise denken Sie diesen Code zu testen, ist Mocks zu injizieren für $stateProvider und $locationProvider. Führen Sie dann die Konfigurationsphase aus. Danach wird behaupten, wie $stateProvider und $locationProvider aussehen sollte.

Wenn mein Denken richtig ist, ist mein Problem dann, ich habe keine Ahnung, wie man diese Mocks in das Modul injiziert und seine Config-Phase aus einem Test ausführt.

Können Sie mir zeigen, wie man diesen Code testet?

+0

Haben Sie eine geeignete Lösung gefunden? – Brune

+0

@Brune Nein.Aber unten gibt es eine neue Antwort, die ich nicht untersucht habe. –

Antwort

0

Sie Jasmine'screateSpy und createSpyObj verwenden können, die Mock Dienstleistungen zu schaffen, und angular-mocks.js ihnen zu injizieren.

Weitere Anweisungen auf Mocks Injektion hier: Injecting a mock into an AngularJS service

In this test schrieb ich für eine Richtlinie von mir Sie folgendes sehen:

  • Linie 9 Fügen Winkel Mock von der Google-CDN
  • Zeile 19 & 20 Erstellen Sie ein falsches rootScope-Objekt
  • Zeile 21 & 22 Erstellen Sie einen gefälschten q-Dienst
  • Leitung 42 Einrichten der Anbieter die Fälschungen in den Dienst
  • Leitung 48 Instanziieren der Dienst zu injizieren, die die Fälschungen hat (dieser Dienst wird in die Richtlinie zu test injiziert)
  • Leitung 53 Rufen Verfahren getestet
  • Zeile 55-59 Assert über den Stand der Fake
+3

Jason, der letzte Link ist kaputt. Außerdem besteht meine Herausforderung nicht darin, verspottete Abhängigkeiten allgemein zu injizieren. Es ist nur mit injizierten verspotteten ** Providern ** zum ** config ** -Block. –

+1

MK, konnten Sie eine Lösung für das gleiche finden? Ich stehe mit demselben Problem fest und bin nicht in der Lage, die Richtlinie zu testen. –

+0

@PriyabratNanda Nein. Aber unten gibt es eine neue Antwort, die ich nicht untersucht habe. –

8

Hier ist, wie Ihr Provider für Unit-Tests zuzugreifen:

describe('yourProvider', function() { 
    var provider; 

    // Get the provider 
    beforeEach(module('app', function (yourProvider) { 
     // This callback is only called during instantiation 
     provider = yourProvider; 
    }); 

    // Kick off the above function 
    beforeEach(inject(function() {})); 

    it('does its thing', function() { 
     expect(provider.someMethod()).toEqual('your results'); 
    }); 
}); 

ich habe nicht sie Es hat sich herauskristallisiert, dass es eine sehr einfache Methode ist, einen Mock zu inszenieren, aber man kann leicht Methoden ausspionieren, und das ist nah genug. Wenn Sie einen Mock von der $ get() Methode des Abhängigkeitsanbieters benötigen, können Sie das auch mit einem anderen Spion tun. Dieses Beispiel zeigt das Zurückgeben eines Mocks und das Einrichten eines zusätzlichen Spions.

describe('yourProvider', function() { 
    var dependency, mock, provider; 

    beforeEach(module('app', function (dependencyProvider) { 
     dependency = dependencyProvider; 
     mock = jasmine.createSpyObj('dependency', [ 
      'methodsGoHere' 
     ]); 
     spyOn(dependency, 'methodName'); 
     spyOn(dependency, '$get').andReturn(mock); 
    }, function (yourProvider) { 
     provider = yourProvider; 
    }); 

    beforeEach(inject(function() {})); 

    it('does its thing', function() { 
     expect(provider.someMethod()).toEqual('your results'); 
     expect(dependency.methodName).toHaveBeenCalled(); 
    }); 

    it('returns the mock from $get', function() { 
     expect(dependency.$get).toBe(mock); 
    }); 
}); 
0

Ich würde eine Fabrik erstellen, die auf eine Funktion verweist ... diese Funktion wird dann auch innerhalb der Config-Funktion aufgerufen. So können Sie Gerät die Fabrik testen:

angular.module('ogApp', ['ngCookies','ui.router','ogControllers','ogServices','ogDirectives','ogMetricsData']); 

// Configuration factory for unit testing 
angular.module('ogApp') 
.factory('configuration', configuration); 

configuration.$inject = ['$stateProvider', '$locationProvider']; 

function configuration($stateProvider, $locationProvider) { 
    return { 
    applyConfig: function() { 
     $stateProvider. 
     state('login', { 
      templateUrl: 'connect.html' 
     }).state('addViews', { 
      templateUrl: 'add-views.html' 
     }).state('dashboard', { 
      templateUrl: 'dashboard.html' 
     }); 
     $locationProvider. 
     html5Mode(true). 
     hashPrefix('!'); 
    }; 
} 

// Call above configuration function from Angular's config phase 
angular.module('ogApp') 
.config([ 
    '$stateProvider', '$locationProvider', 
    function ($stateProvider, $locationProvider) { 
    var config = configuration($stateProvider, $locationProvider); 
    config.applyConfig(); 
    } 
]); 

Sie können die Konfiguration Werkseinheit Test und Mocks injizieren, gerade wie Sie mit einer anderen Fabrik.