Mengejek fungsi ng-init Angulars dalam tes Jasmine

Saya ingin memasukkan fungsi ini ke dalam arahan ng-init ketika saya membuat instance pengontrol dalam pengujian sudut, dalam html saya akan mengaturnya seperti ini:

 <div ng-controller="my-ctrl" ng-init="initialize({updateUrl: 'list_json'})

Dalam pengujian saya, saya hanya bisa menulis fungsi seperti ini yang akan memasukkan hal-hal yang benar ke dalam cakupannya tetapi menurut saya itu berantakan. Saya juga khawatir tentang fungsi yang saat ini terprogram dalam html mengacaukannya di tengah pengujian saya

function initController($scope){

  $scope['updateUrl'] = 'list_json'

}

person FutuToad    schedule 10.01.2014    source sumber


Jawaban (1)


Saya tidak berpikir ng-init membuat fungsi apa pun dengan sendirinya, jadi menurut saya itu hanya cara menggunakannya yang salah (dilihat dari cuplikan Anda).

Apa yang biasanya saya lakukan adalah membuat sendiri fungsi init dan kemudian mengujinya tanpa masalah dalam pengujian unit pengontrol.

<div ng-controller="my-ctrl" ng-init="init({ updateUrl : 'list_json' })">...</div>

function MyController($scope){

  $scope.init = function(config) {
     $scope.updateUrl = config.updateUrl;
  }

}

Kemudian di Jasmine Anda dapat tanpa masalah menulis tes yang akan memanggil fungsi init() (boilerplate dilewati):

// Given
var config = { updateUrl : 'list_json' };
// When
myController.init(config);
// Then
// ...

Komentar penting tentang Pengujian Unit

Jika Anda berpikir bahwa Anda harus menguji apakah markup HTML Anda memanggil init() dengan parameter tertentu, maka saya rasa Anda salah. Tidak ada yang perlu diuji. Tidak ada logika sama sekali di sana! Pengujian Anda harus memverifikasi bahwa komponen berfungsi sebagaimana mestinya, jika programmer membuat kesalahan dengan meneruskan parameter yang salah dari HTML ke Angular, maka Anda tidak perlu repot menutupi kesalahan tersebut dalam pengujian unit. Anda tidak bisa memaksa orang untuk tidak melakukan kesalahan :-)

person ŁukaszBachman    schedule 10.01.2014