Sto usando la sintassi "controller come" per creare il mio controller. Ho una funzione di inizializzazione privata che chiama una funzione per caricare i dati predefiniti.Come spio un metodo di controllo usando Jasmine?
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
var mc = this;
mc.dataLoaded = false;
function init() {
mc.loadData();
}
mc.loadData = function(){
mc.dataLoaded = true;
}
init();
});
Nella mia prova Sto creando una spia per verificare se la funzione loadData
è stato chiamato. Anche se posso verificare che la funzione sia stata chiamata testando il flag mc.dataLoaded
, la mia spia non sembra registrare la funzione chiamata. Come posso convincere la spia a registrare correttamente la chiamata di funzione?
describe('Testing a Hello World controller', function() {
var $scope = null;
var ctrl = null;
//you need to indicate your module in a test
beforeEach(module('plunker'));
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
ctrl = $controller('MainCtrl as mc', {
$scope: $scope
});
spyOn($scope.mc, 'loadData').and.callThrough();
}));
it('should call load data', function() {
expect($scope.mc.loadData).toHaveBeenCalled();
//expect($scope.mc.dataLoaded).toEqual(false);
});
});
Domanda forse fuori ambito ... Potrebbe essere possibile spiare una funzione che non è in $ scope? Voglio dire, spiare 'init' in quel codice. –
"Se MainCtrl sta facendo qualcosa internamente, prova il risultato di ciò, ad esempio, affermando che i dati/proprietà del controller sono aggiornati. Potrebbe non valere la pena di testare se è abbastanza banale." QUESTO DEVE ESSERE DATO! –
E il codice di inizializzazione del controller interno non si basa su un altro servizio, è abbastanza complesso da richiedere il test e non ha effetti collaterali sulle proprietà dell'ambito? La tua unica opzione è spostare il codice di inizializzazione in un altro servizio? Sembra un peccato rendere il tuo codice più complicato solo per abilitare i test unitari. – d512