2013-02-17 24 views
8

Mam kontroler z metodą init() uruchomioną podczas tworzenia instancji. Robi wiele rzeczy, które są przydatne dla mojej aplikacji w środowisku na żywo, ale to psuje się ze szpiegami z moich testów jednostkowych.AngularJS, uniemożliwi uruchamianie metody init na kontrolerze podczas testów jaśminowych

Czy istnieje sposób, aby uniemożliwić wywołanie podczas tworzenia instancji kontrolera w środowisku testu jednostkowego? A może sposób na automatyczne wywoływanie go w kontekście webapp bez wywołania metody init() na końcu kodu kontrolera?

+0

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

+2

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. –

Odpowiedz

12

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

Powiązane problemy