2016-07-05 9 views
4

Mein Code ist:Wie kann ich ein Versprechen testen, das mit Karma verspottet wird?

$scope.openModal = openModal; 


    function openModal(data){ 
    var info = data || {} 
    ModalService.showModal({ 
     templateUrl: ENVApp+"/myview.html", 
     controller: "ModalController", 
     inputs: { 
      icon : "", 
      title: "Additional", 
      data : info 
     } 
     }).then(function (modal) { 
     modal.element.modal(); 
     modal.close.then(function (res) { 
      if(res.data != 'cancel'){ 
      if(!res.data.id){ 
       create(res) 
      }else{ 
       update(res) 
      } 
      } 
     }); 
     }); 
    } 

Was ist der richtige Weg ist das mit Karma zu testen? Hier ist, was ich bisher:

in meinem beforeEach:

this.ModalService = { 
    showModal: function(obj) { 
     var deferred = $q.defer(); 
     deferred.resolve({ 
     element: { 
      modal: jasmine.createSpy(), 
      close: function() { 
      var deferred2 = $q.defer(); 

      return deferred2.promise; 
      } 
     } 
     }); 
     return deferred.promise; 
    } 
    }; 
    this.UserService = { 
    user: { 
     id: 2 
    }, 
    updateCategory: function(data, type) { 
     var deferred = $q.defer(); 
     deferred.resolve({ 
     data: { 
      rows: 'response' 
     } 
     }); 
     return deferred.promise; 
    } 
    } 
    this.controller = $controller('ProfileAdditionalController', { 
    '$scope': this.scope, 
    '$rootScope': this.rootScope, 
    '$state': this.state, 
    "$stateParams": this.stateParams, 
    'ModalService': this.ModalService, 
    'UserService': this.UserService, 
    'ResourceService': this.ResourceService, 
    '$upload': this.upload, 
    'userData': this.userData 
    }); 

Für meinen eigentlichen Test:

it('should open a modal when requested', function() { 
    this.scope.openModal(); 
    expect(this.ModalService.showModal) 
    }); 

Aber das macht nicht viel Sinn machen. Gedanken?

+2

Können Sie 'openModal' das Versprechen zurückgeben, das es von' showModal' verwendet. Ich habe kürzlich ein GUI-Widget getestet, das etwas ähnlich dem tut, was Ihr Code tut: Methode A ruft Methode B auf, und B gab eine Versprechung zurück, die A verwendete. Ich habe gerade beschlossen, A das Versprechen von B (+ Handler) zurückzugeben. Es vereinfacht das Testen sehr. – Louis

Antwort

1

Um Ihre openModal Funktion auf dem Controller zu testen, im Grunde die folgenden (3 Tests)

  1. ModalService.showModal heißt mit einigen spezifischen Optionen
  2. Sobald modal angezeigt wird, stellen Sie sicher, dass die then Funktion überprüfen möchten macht, was es tun soll
  3. Wenn Modal geschlossen ist, vergewissern Sie sich, dass die zweite then Funktion tut, was es tun soll

Zum einen müssen Sie wahrscheinlich einen Spion (mock) auf ModelService.showModal einzurichten: spyOn(ModalService, 'showModal).and.returnValue($q.when(mockModal))

Jetzt in Ihrem Test, werden Sie die Funktion und einen $ Umfang auslösen $ Anruf verdauen.

$scope.openModal(data); 
$scope.$digest() // to propagate the `resolve()` result of the promise) 

Dies würde die erste then Callback auslösen (mit MockModal als Parameter übergeben), die Sie dann überprüfen können, ihr Verhalten.

Um den zweiten Rückruf zu überprüfen, müssen Sie das aufgelöste Objekt modal simulieren.