2015-06-15 2 views
0

У меня есть издеваемое обслуживание, personService ниже, который вызывается контроллером personController, который является тем, что я тестирую.

Я хочу проверить пути прохождения/отказа, очевидно, поэтому я пытаюсь условно направить обещание на разрешение/отклонение на основе ввода в моем тесте, чтобы проверить оба пути.

// Mocking personService and its functions 
    beforeEach(inject(function($q) { 

     personService = { 

      addPerson: function (resolve) { 
       var deferred = $q.defer(); 

       if(resolve) { 
        deferred.resolve(); 
       } 
       else { 
        deferred.reject(); 
       } 

       return deferred.promise; 
      } 
     }; 

     // And add its spies 
     spyOn(personService, 'addPerson').and.callThrough(); 
    })); 

    // Mocking $state 
    beforeEach(inject(function() { 

     $state = { 
      go: function() { 
       return true; 
      } 
     }; 

     // And its spies 
     spyOn($state, 'go').and.callThrough(); 
    })); 

Для этой конкретной функции $ state.go вызывается, если вызов службы к addPerson разрешен, и не вызывается, если он отклонил, так что я лежу мое испытание, как показано ниже:

 it("on return error from personService.add, state.go not called", function() { 
      $scope.addPerson(false); 
      $rootScope.$digest(); 
      expect($state.go).not.toHaveBeenCalled(); 
     }); 

     it("on return success from personService.add, state.go called", function() { 
      $scope.addPerson(true); 
      $rootScope.$digest(); 
      expect($state.go).toHaveBeenCalled(); 
     }); 

В первом тесте я пропускаю ложь, которая должна отклонить обещание, а не называть $ state.go ... однако, когда тест на самом деле запущен, шпион вызывается на $ state.go!

Для справки, функция регулятора в вопросе ниже:

var _addPerson = function() { 
     personService.addPerson().then(function (response) { 
      $state.go('home.person', { personIndex: $scope.personList.length }, { reload: true }); 
      _gotoLastPerson(); 
     }), 
     function (err) { 
      console.log(err); 
     }; 
    }; 

Озадачивающий примечание, которое указывает на то, что я близко ... если я удалить, если/то из addPerson и всегда только deferred.reject (), то первое испытание проходит, а второе терпит неудачу; точное обратное происходит, если я всегда откладываю.resolve().

1) Как использовать условный $ д решительность/отклонить в Jasmine издевались, позвоните в службу

Update

После поиска вокруг него, кажется, некоторые люди ставят все эти настройки в ней() блокирует себя, и в этом случае я мог бы просто изменить службу, чтобы явно разрешить или отклонить, в зависимости от того, в чём она() находится ... но это похоже на ужасные методы кодирования.

ответ

0

Hooray! Хорошо, поэтому я не знаю , почему все это происходило, но решение в addPerson: function (resolve) было фактически объектом person вместо булевого.

Так что вместо этого я создал глобальную переменную varPromise, которую я установил в true/false в зависимости от моей потребности, и она прекрасно работает.

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