1

Я новичок в тестировании жасмина. Как я могу проверить вызов функции в функции часов?Испытание жасмина для вызова функции

Ниже приведен мой код. Я запутался в использовании шпиона в жасмине и как я могу обработать вызов функции внутри наблюдателя.

Нужно ли приостановить выборку() внутри часов. Пожалуйста, предложите, как улучшить свои навыки тестирования.

var app = angular.module('instantsearch',[]); 
    app.controller('instantSearchCtrl',function($scope,$http,$sce){ 
    $scope.$sce=$sce; 
    $scope.$watch('search', function() { 
     fetch(); 
    }); 
    $scope.search = "How create an array"; 
    var result = {}; 
    function fetch() { 
     $http.get("https://api.stackexchange.com/2.2/search?page=1&pagesize=10&order=desc&sort=activity&intitle="+$scope.search+"&site=stackoverflow&filter=!4*Zo7ZC5C2H6BJxWq&key=DIoPmtUvEkXKjWdZB*d1nw((") 
     .then(function(response) { 
      $scope.items = response.data.items; 
      $scope.answers={}; 
      angular.forEach($scope.items, function(value, key) { 
       var ques = value.question_id; 
       $http.get("https://api.stackexchange.com/2.2/questions/"+value.question_id+"/answers?page=1&pagesize=10&order=desc&sort=activity&intitle="+$scope.search+"&site=stackoverflow&filter=!9YdnSMKKT&key=DIoPmtUvEkXKjWdZB*d1nw((").then(function(response2) {                                     
        $scope.answers[ques]=response2.data.items; 
        //console.log(JSON.stringify($scope.answers)); 
       }); 
      }); 
     });                                                            
    } 
}); 

мой тест:

describe('instantSearchCtrl', function() { 
    beforeEach(module('instantsearch')); 

var $scope, ctrl; 

beforeEach(inject(function($rootScope, $controller) { 
     // create a scope object for us to use. 
     $scope = $rootScope.$new(); 


     ctrl = $controller('instantSearchCtrl', { 
     $scope: $scope 
     }); 

    })); 

     /*var $scope = {}; 
     var controller = $controller('instantSearchCtrl', { $scope: $scope }); 
     expect($scope.search).toEqual('How create an array'); 
     //expect($scope.strength).toEqual('strong');*/ 
it('should update baz when bar is changed', function(){ 

    //$apply the change to trigger the $watch. 
    $scope.$apply(); 
    //fetch().toHaveBeenCalled(); 

    fetch(); 
    it(" http ", function(){ 
    //scope = $rootScope.$new(); 
     var httpBackend; 
      httpBackend = $httpBackend; 
      httpBackend.when("GET", "https://api.stackexchange.com/2.2/search?page=1&pagesize=10&order=desc&sort=activity&intitle="+$scope.search+"&site=stackoverflow&filter=!4*Zo7ZC5C2H6BJxWq&key=DIoPmtUvEkXKjWdZB*d1nw((").respond([{}, {}, {}]); 
    }); 
}); 
}); 

ответ

0

Во-первых, вы должны вызвать часы. Для этого необходимо изменить значение поиска и после этого запустить вручную: $scope.$digest() или $scope.$apply()

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

После этого вы должны добавить некоторые заявления expect. Для кода контроллера они должны быть:

expect($scope.items).toEqual(mockResponseToFirstRequest); 
expect($scope.answers).toEqual(mockResponseCombinedForSecondLevelRequests); 

Что касается использования шпиона в тестах карма-жасмин, те ограничивают количество кода тестируемого. Вероятное использование для шпиона в этом случае заключается в замене httpBackend.when с spyOn($http, 'get').and.callFake(function() {})

Вот документация для использования шпионов https://jasmine.github.io/2.0/introduction.html#section-Spies

+0

спасибо вам это помогло мне много – alekhya

+0

этот ответ на ваш вопрос? Если да, проголосуйте – rave