2016-07-26 41 views
1

我很努力地理解如何編寫Angular.js控制器的方法來完成單元測試。互聯網上的所有教程都很簡單,並沒有顯示它在實際應用中的外觀。這些教程顯示所有的方法都通過附加到「範圍」或「this(aka vm)」來公開。根據我的理解,不會在控制器外部使用的方法不需要暴露。在下面的例子中,我只暴露了兩種方法,因爲它們是通過單擊頁面上的按鈕觸發的。其餘的方法僅用於內部目的。 如何測試控制器中的私有方法而不暴露它們?我是否需要公開所有這些才能進行單元測試?公開所有方法是否是一個好習慣?謝謝正確的方法來編寫Angular的代碼以允許單元測試

angular.module('app.pool',[]) 
    .controller('PoolController', PoolController); 

function PoolController(PoolService) { 
    var vm = this; 

    vm.candidateName=''; 
    vm.candidatePicUrl=''; 

    vm.approveCandidate = approveCandidate; 
    vm.refuseCandidate = refuseCandidate; 

    function approveCandidate() { 
     PoolService.approveCandidate(); 
     getNextCandidate(); 
    } 

    function refuseCandidate() { 
     PoolService.refuseCandidate(); 
     getNextCandidate(); 
    } 

    function getNextCandidate() { 
     clearProfile(); 
     PoolService.getNextCandidate(). 
     success(displayUserData); 
    } 

    function displayUserData(data) { 
     vm.candidateName = getCandidateName(data); 
     vm.candidatePicUrl = getCandidateProfilePic(data); 
    } 

    function getCandidateName(data) { 
     return data.userName; 
    } 

    function getCandidateProfilePic(data) { 
     return changeUrlToBiggerPic(data.profilePicture); 
    } 

    function changeUrlToBiggerPic(url) { 
     return url.replace('s150x150', 's600x600'); 
    } 

    function clearProfile() { 
     vm.candidateName = ""; 
     vm.candidatePicUrl = ""; 
    } 

}

回答

1

絕對不是一個好主意,暴露私有方法只是單元測試的緣故。

您應該能夠通過預期特定輸出來測試這些方法正在執行的操作。

例如:

  • 檢查一個變量範圍已被設置爲期望的值。
  • 確保使用正確的輸入調用了提供的依賴項(spied)。
0

它總是取決於案件,但是,是的,暴露私人類方法通常是一個好主意。

可以使用_前綴約定來命名私有方法,以將它們與公共方法區分開來,並且可以使用Object.defineProperty進行非枚舉。

JavaScript不能反映私有成員(局部變量)。除了作爲基本的面向對象原則和「一件好事」之外,封裝還會損害JS的可測試性,並且幾乎沒有什麼可以提供。

封裝不會增加JS應用程序的安全性,並且將單位視爲黑盒並不能提供任何幫助。另一方面,將間諜放在每個被調用的方法上都有幫助。

+1

我個人感謝一位陌生人,他保留了他的寶貴觀點,以零評論降低了整個問題的質量。您的寶貴意見非常感謝。 – estus

相關問題