1

我是新來茉莉花測試。如何在手錶功能中測試函數調用?功能調用茉莉花測試

以下是我的代碼。我對茉莉花間諜的使用感到困惑,我如何處理觀察者內部的函數調用。

我是否需要暫停手錶中的fetch()。請建議如何提高我的測試技能。

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()

爲了全面測試fetch函數,您還應該模擬對第二個請求的響應(或者模擬所有第二級請求,如果您想要測試迭代)。

之後,您應該添加一些expect語句。對於控制器代碼,它們應該是:

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

至於在karma-jasmine測試中使用間諜,那些限制測試代碼的數量。在這種情況下,間諜的一種可能的用途是httpBackend.whenspyOn($http, 'get').and.callFake(function() {})

這裏取而代之的是使用間諜https://jasmine.github.io/2.0/introduction.html#section-Spies

+0

文檔謝謝它幫了我很多 – alekhya

+0

這是否回答你的問題?如果是這樣,請投票 – rave