ฉันได้อ่านบทช่วยสอนและตัวอย่างพื้นฐานมาบ้างแล้ว แต่ฉันประสบปัญหาในการเขียนการทดสอบหน่วยสำหรับคอนโทรลเลอร์ของฉัน ฉันเคยเห็นข้อมูลโค้ดที่สร้างอินสแตนซ์ให้กับคอนโทรลเลอร์และปล่อยให้เชิงมุมฉีดวัตถุ $rootScope
ซึ่งจะถูกใช้เพื่อสร้างวัตถุ scope
ใหม่สำหรับคอนโทรลเลอร์ แต่ฉันไม่เข้าใจว่าทำไม ctrl.$scope
? ไม่ได้กำหนดไว้:
describe('EmployeeCtrl', function () {
var scope, ctrl, $httpBackend;
beforeEach(inject(function (_$httpBackend_, $rootScope, $controller, $filter) {
$httpBackend = _$httpBackend_;
scope = $rootScope.$new();
ctrl = $controller('EmployeeCtrl', { $scope: scope});
expect(ctrl).not.toBeUndefined();
expect(scope).not.toBeUndefined(); //<-- PASS!
expect(ctrl.$scope).not.toBeUndefined(); //<-- FAIL!
}));
});
ฉันลงเอยด้วยการใช้ตัวแปร scope
แทน ctrl.$scope
แต่ในการทดสอบครั้งแรก ฉันไม่สามารถหาวิธีทดสอบ ตัวแปรฟังก์ชัน ภายในคอนโทรลเลอร์ของฉันได้:
ตัวควบคุม:
function EmployeeCtrl($scope, $http, $filter, Employee) {
var searchMatch = function (haystack, needle) {
return false;
}
}
การทดสอบหน่วยที่เสียหาย:
it('should search ', function () {
expect(ctrl.searchMatch('numbers','one')).toBe(false);
});
นี่คือสิ่งที่ฉันได้รับ
TypeError: Object # ไม่มีวิธี 'searchMatch'
คุณจะทดสอบฟังก์ชั่นนั้นได้อย่างไร? เพื่อเป็นวิธีแก้ปัญหา ฉันย้ายวิธีการของฉันไปที่ $scope เพื่อทดสอบหา scope.searchMatch
แต่ฉันสงสัยว่านี่เป็นวิธีเดียวหรือไม่
สุดท้าย ในการทดสอบของฉันปรากฏว่า $filter
ไม่ได้กำหนดเหมือนกัน คุณจะฉีดมันได้อย่างไร ฉันลองสิ่งนี้แต่ไม่ได้ผล:
ctrl = $controller('EmployeeCtrl', { $scope: scope, $filter: $filter });
ขอบคุณ
อัปเดต: วิธีการดังกล่าวข้างต้นเพื่อแทรก $filter ก็ใช้ได้ดี