eventos entre ejemplo controladores comunicacion change angularjs jasmine karma-runner angularjs-controller angularjs-http

angularjs - entre - ng-if



¿Cómo podemos probar los métodos de controlador angular sin alcance? (2)

Tenemos pocos métodos en Angular Controller, que no están en la variable de alcance.

¿Alguien sabe, cómo podemos ejecutar o llamar a esos métodos dentro de la prueba de jazmín?

Aquí está el código principal.

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(); }

Ahora en mi prueba de jazmín, estamos pasando el método "handleSuccessOfAPI" y "handleFailureOfAPI", pero estos no están definidos.

Aquí está el código de prueba de jazmín.

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); }); });


Como no tendrá acceso a esas funciones. Cuando defines una función JS con nombre es la misma que si dijeras

var handleSuccessOfAPI = function(){};

En ese caso, sería muy claro ver que la var solo está en el alcance dentro del bloque y que no hay referencia externa desde el controlador de envoltura.

Cualquier función que pueda llamarse discretamente (y, por lo tanto, probada) estará disponible en $ scope del controlador.


Sé que este es un caso antiguo, pero esta es la solución que estoy usando.

Usa el ''esto'' de tu controlador

.controller(''newController'',[''$scope'',function($scope){ var $this = this; $this.testMe = function(val){ $scope.myVal = parseInt(val)+1; } }]);

Aquí está la prueba:

describe(''newDir'', function(){ var svc, $rootScope, $scope, $controller, ctrl; beforeEach(function () { module(''myMod''); }); beforeEach(function () { inject(function ( _$controller_,_$rootScope_) { $controller = _$controller_; $rootScope = _$rootScope_; $compile = _$compile_; $scope = $rootScope.$new(); ctrl = $controller(''newController'', {''$rootScope'': $rootScope, ''$scope'': $scope }); }); }); it(''testMe inc number'', function() { ctrl.testMe(10) expect($scope.myVal).toEqual(11); });

});

Ejemplo de código completo