2016-06-29 106 views
4

我需要測試一個指令控制器裏面有$元素。所以,我有這樣一個功能:嘲笑茉莉花角元素

function func($event) { 
     $element.find('#la-la-la').focus(); 
} 

,並使其在測試:

template = $compile(element)($scope); 
$scope.$apply(); 

controller = element.controller('myDirective'); 

而我正在試圖做的是測試控制器內該功能指示。

describe('func method', function testFunc() { 
    it('should focus on element', function checkFocusing() { 
     controller.func(); 
     expect(focusSpy).toHaveBeenCalled(); 
    }); 
}); 

其中「focusSpy」是嘲笑$元素服務中的間諜。 但它似乎是如果我使用$ provide.service('$ element',...)它沒有被測試找到。在編譯之前將它注入$ scope。$ element也不起作用。謝謝!

回答

2

好的,我找到了一個可能的解決方案。你不能模擬$元素,因爲它是一個指令控制器的私有變量,但是因爲它是一個jQuery元素,所以你可以像jQuery一樣監視它:

describe('func method', function testFunc() { 
    it('should focus on element', function checkFocusing() { 
     spyOn($.fn, 'find').and.callThrough(); 
     spyOn($.fn, 'focus').and.callThrough(); 

     controller.func(); 

     expect($.fn.find).toHaveBeenCalledWith('#la-la-la'); 
     expect($.fn.focus).toHaveBeenCalled(); 
    }); 
});