2016-07-05 4 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) 
      } 
      } 
     }); 
     }); 
    } 

Что такое правильный способ проверить это с кармой? Вот то, что я до сих пор:

в мой 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 
    }); 

Для моего фактического теста:

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

Но это не делает много смысла. Мысли?

+2

Можете ли вы оставить openModal обещание, которое оно использует от 'showModal'. Недавно я тестировал виджет GUI, который делает что-то похожее на то, что делает ваш код: метод A вызывал метод B, а B возвращал обещание, которое использовал A. Я просто решил вернуть А обещание, полученное от B (+ handlers). Это упростило тестирование. – Louis

ответ

1

Чтобы проверить openModal функции на контроллере, в основном вы хотите проверить следующие (3 теста)

  1. ModalService.showModal вызывается с некоторыми конкретными вариантами
  2. После отображения модальных, убедитесь, что функция then делает то, что он должен делать
  3. Когда модальное закрыто, убедитесь, что вторая функция 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.

Смежные вопросы