ฟังก์ชั่น Mocking Angulars ng-init ในการทดสอบ Jasmine

ฉันต้องการแทรกฟังก์ชันนี้ลงในคำสั่ง ng-init เมื่อฉันสร้างอินสแตนซ์ของคอนโทรลเลอร์ในการทดสอบเชิงมุม ใน html ฉันจะตั้งค่าดังนี้:

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

ในการทดสอบของฉัน ฉันสามารถเขียนฟังก์ชันเช่นนี้ซึ่งจะยึดสิ่งที่ถูกต้องไว้ในขอบเขต แต่ฉันคิดว่ามันยุ่งเหยิง นอกจากนี้ ฉันยังกังวลเกี่ยวกับฟังก์ชันที่ปัจจุบันมีการเชื่อมต่อแบบฮาร์ดไวด์ใน html ซึ่งทำให้การทดสอบกึ่งกลางของฉันยุ่งเหยิง

function initController($scope){

  $scope['updateUrl'] = 'list_json'

}

person FutuToad    schedule 10.01.2014    source แหล่งที่มา


คำตอบ (1)


ฉันไม่คิดว่า ng-init สร้างฟังก์ชันใดๆ ด้วยตัวเอง ดังนั้นฉันคิดว่ามันเป็นเพียงวิธีใช้งานที่ผิด (ตัดสินโดยตัวอย่างของคุณ)

สิ่งที่ฉันมักจะทำคือสร้างฟังก์ชัน init ด้วยตัวเอง จากนั้นทดสอบโดยไม่มีปัญหาในการทดสอบหน่วยของคอนโทรลเลอร์

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

function MyController($scope){

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

}

จากนั้นใน Jasmine คุณสามารถเขียนการทดสอบซึ่งจะเรียกใช้ฟังก์ชัน init() ได้โดยไม่มีปัญหา (ข้ามหม้อต้ม):

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

ความคิดเห็นที่สำคัญเกี่ยวกับการทดสอบหน่วย

หากคุณคิดว่าคุณควรทดสอบว่ามาร์กอัป HTML ของคุณเรียก init() ด้วยพารามิเตอร์ที่กำหนดหรือไม่ ฉันคิดว่าคุณคิดผิด ไม่มีอะไรที่จะทดสอบ ไม่มีตรรกะเลย! การทดสอบของคุณควรตรวจสอบว่าส่วนประกอบต่างๆ ทำงานตามที่ควรทำงาน หากโปรแกรมเมอร์ทำผิดพลาดโดยส่งพารามิเตอร์ที่ไม่ถูกต้องจาก HTML ไปยัง Angular คุณไม่ควรกังวลกับการครอบคลุมข้อผิดพลาดดังกล่าวในการทดสอบหน่วย คุณไม่สามารถบังคับคนอื่นไม่ให้ทำผิดได้ :-)

person ŁukaszBachman    schedule 10.01.2014