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