2013-08-15 11 views
6

używam Jasmine pisać testy jednostkowe dla naszych kontrolerów, ale chciał uzyskać opinię społeczną, w jaki sposób obsługiwać tej sytuacji ...angularjs jak testy jednostkowe w celu zapewnienia jak dyrektyw ng kliknięciem wskaż prawidłowy kod

mam kontroler - InvoiceController coś takiego:

angular.module('myModule').controller('myController', ['$scope', 
    function($scope) { 
     $scope.doSomething = function() { 
      $scope.something = 'bar'; 
     }; 
    } 
]}); 

w moich testów jednostkowych I zweryfikować, że mój kontroler ma oczekiwanych metody:

it('should be able to do some work', function() { 

    // initialize scope properties 
    scope.someProperty = 'foo'; 

    // load controller using those properties 
    injectController(); 

    // do I have all of the functions necessary to do this work? 
    expect(typeof (scope.doSomething)).toBe('function'); 

    // now execute test 
    scope.doSomething(); 
    expect(scope.something).toBe('bar');  

} 

i wreszcie, w moim html mam element z ng-click, taki jak ten:

<button ng-click="doSomehing()">Do Something</button> 

Wygląda dobrze, prawda? ALE, czy ktoś złapał to, co zrobiłem źle?

Moja metoda ng-click jest błędnie napisana, ale wszystkie testy są zielone, a życie wydaje się różowe ... dopóki nie spróbuję kliknąć tego gościa i nic się nie dzieje. Brak czasu renderowania, brak błędu kliknięcia. Hmm.

Kilka razy teraz, gdy koduję refaktoryzacji, to mnie. Zmieniam nazwę DoSomething, aby wykonaćComethingCooler w teście jednostki i kontrolera, ale pomijam miejsce w html. Po minucie drapania głowy widzę, co zostało pominięte.

Chciałbym sposób, aby upewnić się, że znacznik jest ważny. Testy E2E wydają się być oczywistym rozwiązaniem, ale są podatne na niestabilność, więc mamy nadzieję, że istnieją pewne alternatywy.

Jeśli był to program ASP.Net, dołączałbym zdarzenia kliknięcia z kodu, aby uzyskać błędy czasu kompilacji w porównaniu z błędami czasu wykonywania.

Myśli?

Thad

+0

Dlaczego mówisz, że jesteś podatny na niestabilność? Test powinien załadować szablon DOM, kliknąć przycisk, a następnie sprawdzić, czy wynik był zgodny z oczekiwaniami, a jeśli nie, test się nie powiedzie, a Ty złapiesz miejsca, w których zmieniłeś nazwy lub błędnie napisane. – aet

+0

@aet - Dobre pytanie. Uważam, że gdy masz system, który jest aktywnie rozwijany, test E2E pozwala ci spędzać więcej czasu na utrzymaniu testów niż na kodowaniu potrzeb biznesowych. Po ostatecznym wylogowaniu i stabilnym systemie możesz dodać więcej testów obejmujących; do tego czasu wolę koncentrować się na testowaniu z małymi, niezależnymi jednostkami pracy, które w razie potrzeby można bardzo szybko modyfikować. Osiągnąłem to w ASP.Net, wiążąc zdarzenia po stronie serwera, a nie w znacznikach, aby zapewnić rozbieżności w czasie kompilacji, a nie w czasie wykonywania. –

Odpowiedz

2

Jedno można zrobić, to tekst szablonu i uruchom $compile na nim. A następnie połącz go z zakresem kontrolera. Wtedy możesz zrobić coś takiego, jak dom.find('[ng-click]').click();, które powinno zostać rzucone, jeśli którekolwiek z nich nie jest zdefiniowane w zasięgu twojego kontrolera. Jest to podobne do tego, jak na ogół testujesz dyrektywy.