2017-08-23 73 views
1

我想測試一個JavaScript函數,它要求DOM中存在某個元素。下面是我想測試功能:嘲笑jQuery選擇器並返回一個html元素

auction.save_scroll_state = function() { 
    var user_agent = $window.navigator.userAgent.toLowerCase(); 
    var is_android = user_agent.indexOf("android") > -1; 

    if (is_android) { 
     var restore_pos = null; 
     debugger 
     if ($location.search().section == "items") { 
     restore_pos = $('#all-items').scrollTop(); 
     $('#all-items').one('scroll', function(){$('#all-items').scrollTo(restore_pos)}); 
     } 
     else if ($location.search().section == "user_items"){ 
     restore_pos = $('#your-items').scrollTop(); 
     $('#your-items').one('scroll', function(){$('#your-items').scrollTo(restore_pos)}); 
     } 
    } 
    }; 

當我運行測試,並獲得任何類型的$('#all-items').length返回0表明元素不能被發現的調試器。 我想形成某種Jasim間諜,它會模擬出jquery選擇器。我的測試是在下面:

it ('save_scroll_state android user_agent all-items', inject(function($bwAppState, $location, $window) { 
    $window.navigator = {userAgent: "Mozilla/5.0 (Linux; Android 7.0; SM-G950F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36"}; 
    var items_div = $("<div id='all-items'></div>"); 
    var jq_div_spy = spyOn($.fn, 'html').and.returnValue(items_div); 
    var items_div_spy = spyOn(items_div, 'scrollTop'); 
    spyOn($location, "search").and.returnValue({section: 'items'}); 
    $bwAppState.auction.save_scroll_state(); 
    expect(items_div_spy).toHaveBeenCalled(); 
    delete $window.nagivator; 
})); 

主要目標是確保scrollTop()被調用,有一些HTML元素的id="all-items" ID標籤上。

任何幫助,將不勝感激

回答

0

不理想,但可以做的:

describe('ScrollTop on .test', function(){ 

    var scrollTopSpy; 

    beforeEach(function(){ 
     scrollTopSpy = jasmine.createSpyObj('$-spy', ['scrollTop']); 
     spyOn(window, '$').and.callFake(function(selector){ 
      if(selector == '.test') { 
       return scrollTopSpy; 
      } 
      else { 
       return $(selector); 
      } 
     }); 
    }); 

    it('is called', function(){ 
     $('.test').scrollTop(); 
     expect($('.test').scrollTop).toHaveBeenCalled(); 
    }); 

    it('is not called', function(){ 
     expect($('.test').scrollTop).not.toHaveBeenCalled(); 
    }) 
}) 

請執行沒有,只有scrollTop.test呼叫,測試是無知的真實.test元素存在的DOM。