Ich habe ein paar Tutorials und grundlegende Beispiele durchgegangen, aber ich habe es schwer, Komponententests für meinen Controller zu schreiben. Ich habe Code-Snippets gesehen, die Controller instanziieren und das Objekt $rootScope
eckig injizieren lassen, das wiederum verwendet wird, um ein neues Objekt scope
für den Controller zu erstellen. Aber ich kann nicht herausfinden, warum ctrl.$scope
? ist undefined:
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!
}));
});
ich statt ctrl.$scope
den scope
Variable landete dann aber bei meinem ersten Test konnte ich nicht herausfinden, wie Unit-Test eine Funktion Variable in meinem Controller:
Controller:
function EmployeeCtrl($scope, $http, $filter, Employee) {
var searchMatch = function (haystack, needle) {
return false;
}
}
Gebrochene Einheit Test:
it('should search ', function() {
expect(ctrl.searchMatch('numbers','one')).toBe(false);
});
Dies ist, was ich
TypeError: Object # has no method 'searchMatch'
Wie Sie diese Funktion testen bekommen? Als Workaround habe ich meine Methode nach $ scope verschoben, so dass ich für scope.searchMatch
testen konnte, aber ich fragte mich, ob das der einzige Weg ist.
Schließlich erscheint auf meinen Tests $filter
ist undefined zu, wie injizieren Sie es? Ich habe versucht, dies aber nicht funktioniert hat:
ctrl = $controller('EmployeeCtrl', { $scope: scope, $filter: $filter });
Dank
Update: Das oben genannte Verfahren $ Filter zu injizieren, funktioniert gut.
mein Jasmin-Test bricht auf die inject-Methode. Es wird nicht gefunden. Was vermisse ich. eckig ist nicht null. Ich habe einen Test, der überprüft, dass er geladen ist. – Hcabnettek