Wir haben wenige Methoden in Angular Controller, die nicht auf der Scope-Variable sind.Wie können wir nicht-Winkel-Controller-Methoden testen?
Weiß jemand, wie wir diese Methoden in Jasmine-Tests ausführen oder aufrufen können?
Hier ist der Hauptcode.
var testController = TestModule.controller('testController', function($scope, testService)
{
function handleSuccessOfAPI(data) {
if (angular.isObject(data))
{
$scope.testData = data;
}
}
function handleFailureOfAPI(status) {
console.log("handleFailureOfAPIexecuted :: status :: "+status);
}
// this is controller initialize function.
function init() {
$scope.testData = null;
// partial URL
$scope.strPartialTestURL = "partials/testView.html;
// send test http request
testService.getTestDataFromServer('testURI', handleSuccessOfAPI, handleFailureOfAPI);
}
init();
}
Jetzt in meinem Jasmin Test werden wir "handleSuccessOfAPI" und "handleFailureOfAPI" Methode übergeben, aber diese sind nicht definiert.
Hier ist Jasmin Testcode.
describe('Unit Test :: Test Controller', function() {
var scope;
var testController;
var httpBackend;
var testService;
beforeEach(function() {
module('test-angular-angular');
inject(function($httpBackend, _testService_, $controller, $rootScope) {
httpBackend = $httpBackend;
testService= _testService_;
scope = $rootScope.$new();
testController= $controller('testController', { $scope: scope, testService: testService});
});
});
afterEach(function() {
httpBackend.verifyNoOutstandingExpectation();
httpBackend.verifyNoOutstandingRequest();
});
it('Test controller data', function(){
var URL = 'test server url';
// set up some data for the http call to return and test later.
var returnData = { excited: true };
// create expectation
httpBackend.expectGET(URL).respond(200, returnData);
// make the call.
testService.getTestDataFromServer(URL , handleSuccessOfAPI, handleFailureOfAPI);
$scope.$apply(function() {
$scope.runTest();
});
// flush the backend to "execute" the request to do the expectedGET assertion.
httpBackend.flush();
// check the result.
// (after Angular 1.2.5: be sure to use `toEqual` and not `toBe`
// as the object will be a copy and not the same instance.)
expect(scope.testData).not.toBe(null);
});
});
Korrekt. Außerdem sollten wir keine privaten Funktionen testen. Im Allgemeinen wird 'init()' mit Einheitsdaten getestet, die sicherstellen, dass 'handleSuccessOfAPI' oder' handleFailureOfAPI' aufgerufen wird. Gespiegelte Objekte/Daten sollten den Ausführungspfad steuern. – dmahapatro
Ich sehe $ scope, wie die Funktion/Variable öffentlich gemacht wird (wenn man sie mit etwas wie Java vergleicht). Ich bin mit Komponententests in Java nicht sehr vertraut, aber "teste ich nicht private Funktionen", was Sie normalerweise in Java tun? – Chris
Chris, ich habe nur begrenzte Erfahrung beim Schreiben von Tests im Allgemeinen, habe einige JUnit-Tests geschrieben, aber ich bin keineswegs ein Experte im Testen oder so. Ich stelle mir vor, da die privaten Funktionen nicht offengelegt werden, wenn Sie eine Instanz eines Objekts instanziieren, befinden Sie sich immer noch unter der gleichen Einschränkung, dass Sie nur die Dinge testen können, die öffentlich zugänglich sind. Ich denke, dass dies letztendlich sinnvoll ist, da Sie sich wirklich mit einem Codeabschnitt beschäftigen, der eine Aufgabe in einer Art Black Box abschließt, wenn Sie einen Test schreiben, also wenn ich x voraussage, aber die Implementierungsdetails nicht eine Sorge. – shaunhusain