2015-11-13 92 views
2

我希望這是一個簡單的問題。如何測試窗口點擊角度事件監聽器

我有一個選擇框指令,應該在指令之外單擊任何東西時關閉。因此,窗口有一個事件偵聽器隱藏盒子一旦點擊事件是heard-

$window.addEventListener('click', function() { 
    $scope.expanded = false; 
    $scope.$apply(); 
}); 

工作正常,沒有任何怨言。但我試圖爲此編寫一個單元測試,並且無法知道如何觸發點擊,即使在窗口本身。

it('should close the dropdown if the window is clicked', function() { 
    toggleButton.trigger('click'); 

    expect(eleSimpleOptionBox.hasClass('ng-hide')).toBe(false); 

    $window.trigger('click'); 

    expect(eleSimpleOptionBox.hasClass('ng-hide')).toBe(true); 
}); 

我已經試過以下各項

$window.trigger('click'); // as well as .click() 
$window.triggerHandler('click'); 
angular.element('body').trigger('click'); // as well as .click() 
someWrappingElement.trigger('click'); // as well as .click() 
+0

您是否在觸發事件後在您的範圍或'$ rootScope'上調用'$ digest'? – yarons

+0

都不是。但在測試中,第一個點擊觸發器沒有'$ digest',所以我假設第二個會觸發。它使用DOM事件監聽器而不是角色事件監聽器。 –

回答

0

遇到類似的情況試圖測試$窗口對象上的click事件。我嘗試了所有上述嘗試並觸發事件,但我無法啓動該事件。我的解決方法是,做類似下面的代碼片段的測試,這樣我可以測試監聽功能..還是不滿意的話,但它是更好的,沒有考我猜...

describe('test $window events',()=> { 
    var callbackFn; //variable to capture the callback 

    beforeEach(()=> { 
     //spy on the addEventListener method and capture the function reference 
     spyOn($window, 'addEventListener').and.callFake((event: string, callback: any) => { 
      callbackFn = callback; 
     }); 
    }); 

    //trigger the callbackFn in your test 
    it('should call the event listener',()=> { 
     callback(); //this will trigger the event.. 
     expect(true).toBe(true); 
    ); 
}); 
0

嘗試這樣的:

function triggerMouseEvent(node, eventType, x, y) { 
    var event = document.createEvent('MouseEvents'); 
    event.initMouseEvent(
     eventType,     // type 
     true,      // canBubble 
     eventType != 'mousemove', // cancelable 
     window,      // view 
     0,       // detail 
     x,       // screenX 
     y,       // screenY 
     x,       // clientX 
     y);       // clientY 
    node.dispatchEvent(event); 
} 
triggerMouseEvent($window, 'click'); 

initMouseEvent功能現在已經過時和MouseEvent應該使用,但看起來像IE不支持的MouseEvent呢。