2016-07-05 8 views
4

私のコードは次のとおりです。カルマと嘲笑された約束をどのように試すことができますか?

$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) 
      } 
      } 
     }); 
     }); 
    } 

カルマでこれをテストするための適切な方法は何ですか?私の実際のテストでは

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 
    }); 

:私のbeforeEach

:ここでは、私がこれまで持っているものだ

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

しかし、それは意味の全体の多くを作成しません。思考?

+2

'openModal'は' showModal'から使用している約束を返せますか?私は最近あなたのコードがやっていることに似た何かをするGUIウィジェットをテストしていました。メソッドAはメソッドBを呼び出していました。そして、BはAが使っていた約束を返しました。私はAがB(+ハンドラー)から得た約束を返すように決めました。テストを単純化しました。 – Louis

答えて

1

は基本的にあなたが

  1. ModalService.showModal
  2. モーダルが表示されたら
  3. then機能することを確認し、いくつかの特定のオプションと呼ばれ、次の(3テスト)を確認したい、あなたのコントローラ上のopenModal機能をテストするにはそれが何をしようとしているのかを実行している
  4. モーダルが閉じられると、2番目のthen関数は、何をするかを確認していることを確認してください。

まず、あなたはおそらくModelService.showModalにスパイ(モック)を設定する必要があります: spyOn(ModalService, 'showModal).and.returnValue($q.when(mockModal))

今、あなたのテストでは、あなたが機能して$スコープをトリガします$コールをダイジェスト:

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

これは最初のthenコールバックを起動し(mockModalをパラメータとして渡します)、その動作を確認できます。

同様に、2番目のコールバックを確認するには、解決済みのmodalオブジェクトをモックする必要があります。

関連する問題