2016-08-31 5 views
5

funkcji przetestować kontroler:jak funkcjonować w zakresie regulatora wykonywany przez zdarzenia

angular.module('myApp').controller('MyController', function(){ 

    $scope.f = function($event){ 
     $event.preventDefault(); 
     //logic 
     return data; 
    } 
}) 

describe('MyController', function(){ 
    'use strict'; 
    var MyController, 
     $scope; 

    beforeEach(module('myApp')); 

    beforeEach($inject(function($rootScope, $controller){ 
     $scope = $rootScope.$new(); 
     MyController = $controller('MyController', { 
      $scope: $scope 
     }) 
    })); 
}) 
it('should...', function(){ 
    //fire event and expect data 
}) 

$scope.f Funkcja ta jest wykorzystywana w dyrektywie, mogą być wykonywane przez ng-click="f($event)"

co jest właściwym sposobem na razie pożaru w jednostce test?

+1

mógłbyś podać jakieś bardziej kontekstowe informacje? –

+0

@EvanBechtol przepraszam, mam nadzieję, że teraz jest bardziej zrozumiały – rossoneri

Odpowiedz

4

Krótka odpowiedź

Nie trzeba do ognia zdarzenie. Masz dostęp do zakresu, który ma funkcję, którą chcesz przetestować. Oznacza to, że po prostu wykonujesz funkcję, a następnie potwierdzasz. Będzie to wyglądać mniej więcej tak:

it('should call preventDefault on the given event', function(){ 
    var testEvent = $.Event('someEvent'); 
    $scope.f(testEvent); 
    expect(testEvent.isDefaultPrevented()).toBe(true); 
}); 

zobacz:

pełne wyposażenie

Również - Twój blok it powinny b e wewnątrz twojego bloku describe, tak aby miał dostęp do pola $scope. Powinno to wyglądać mniej więcej tak:

describe('MyController', function(){ 
    'use strict'; 
    var MyController, 
     $scope; 

    beforeEach(module('myApp')); 

    beforeEach($inject(function($rootScope, $controller){ 
    $scope = $rootScope.$new(); 
    MyController = $controller('MyController', { 
     $scope: $scope 
    }) 
    })); 

    it('should call preventDefault on the given event', function(){ 
    var testEvent = $.Event('someEvent'); 
    $scope.f(testEvent); 
    expect(testEvent.isDefaultPrevented()).toBe(true); 
    }); 
}) 

notatkę o strukturze

Nie bój się korzystać z describe klocki uporządkować swoje testy. Wyobraź sobie, że miał inną funkcję na $scope nazywa f2, wtedy prawdopodobnie chcesz podzielić swoją Spec złożyć się więcej tak:

describe('MyController', function(){ 
    'use strict'; 
    var MyController, 
     $scope; 

    beforeEach(module('myApp')); 

    beforeEach($inject(function($rootScope, $controller){ 
    $scope = $rootScope.$new(); 
    MyController = $controller('MyController', { 
     $scope: $scope 
    }) 
    })); 

    describe('$scope', function() { 
    describe('.f()', function() { 
     // tests related to only the .f() function 
    }); 

    describe('.f2()', function() { 
     // tests related to only the .f2() function 
    }); 
    }); 
}) 

Ma to tę zaletę, że gdy test nie powiedzie się, pojawi się komunikat o błędzie widzisz jest skonstruowany na podstawie hierarchii bloków describe. Więc byłoby to coś jak:

MyController $ zakres .f() powinna wywołać preventDefault na danym imprezy

Powiązane problemy