Trochę trudno jest podać precyzyjne wskazówki, nie widząc przykładu z kodem na żywo (dlatego zazwyczaj dobrym pomysłem jest dostarczenie pluna z szablonem do testów Jasmine), ale wygląda na to, że twoja metoda init
wykonuje pewne logika instalacji, która powinna być różna w zależności od środowiska. Jeśli tak, sposobem na przejście do przodu byłoby zamknięcie tej logiki inicjalizacji w dedykowanej usłudze i wyśmiewanie tej usługi podczas testowania (dokładnie to sugeruje @Joe Dyndale).
Pod warunkiem, że kontroler wygląda następująco:
app.controller('MainCtrl', function($scope) {
$scope.init = function() {
//something I really don't want to call during test
console.log("I'm executing");
};
});
To może być refactored do:
app.factory('InitService', function() {
return {
init = function() {
//something I really don't want to call during test
console.log("I'm executing");
}
};
});
app.controller('MainCtrl', function($scope, InitService) {
InitService.init();
});
a następnie testy z wyśmianie mógłby wyglądać tak:
describe('Testing an initializing controller', function() {
var $scope, ctrl;
//you need to indicate your module in a test
beforeEach(module('plunker'));
beforeEach(module(function($provide){
$provide.factory('InitService', function() {
return {
init: angular.noop
};
});
}));
beforeEach(inject(function($rootScope, $controller) {
$scope = $rootScope.$new();
ctrl = $controller('MainCtrl', {
$scope: $scope
});
}));
it('should test sth on a controller', function() {
//
});
});
Wreszcie here to kod na żywo w plunker
Przydałoby się trochę więcej kontekstu na temat tego, co faktycznie dzieje się w init() w celu uzyskania odpowiedniej odpowiedzi. W zależności od tego, istnieje kilka różnych ścieżek, które możesz wziąć. – johlrich
Brzmi jak kandydat do przejścia do usługi lub dyrektywy. Jeśli kod może zostać przeniesiony poza kontroler, można go wyłudzić (w twoim przypadku prawdopodobnie z funkcją noop) w testach jednostkowych. –