Pergunta

Eu tenho um método que está definido em um controlador.Este método é passado para uma diretiva customizada que possui um escopo isolado.Como faço para testar a implementação de $scope.search corretamente?

AutocompleteCtrl

$scope.query = function (term) {
    // some async stuff
};

Modelo

<div ng-controller="AutocompleteCtrl">
    <div typeahead data-search="query(term)"></div>
</div>

Diretiva (excerto)

return {
    controller: 'AutocompleteDirectiveCtrl',
    scope: {
        search: '&'
    }
}

AutocompleteDirectiveCtrl

$scope.query = function (term) {
    if (term.length > ($scope.minChars - 1)) {
        $scope.search({term: term});
    }
};

Teste de unidade

describe('Autocomplete AutocompleteDirectiveCtrl', function () {
    var $scope, $window;

    beforeEach(module('myApp'));

    beforeEach(module(function ($provide) {
        $window = {
            location: {},
            document: window.document
        };

        // We register our new $window instead of the old
        $provide.constant('$window', $window);
    }));

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


    describe('Ducktyping', function () {
        it('should contain a submit method', function () {
            expect($scope.submit).toBeDefined();
        });
    });

    describe('Controller Functionality', function () {
        it('should return false if a submit request has no term set', function () {
            expect($scope.submit()).toEqual(false);
        });
        it('should redirect to search-results page if a term is present', function () {
            $scope.action = 'search-results.html';
            $scope.submit('mySearchTerm');
            expect($window.location.href).toBe('search-results.html/products/mySearchTerm');
        });
        it('should do a searchquery if term length is equal or longer then min-chars', function () {
            $scope.minChars = 3;
            $scope.query('myTerm');
        });
    });
});

Registro

TypeError: 'undefined' is not a function (evaluating '$scope.search({term: term})')
Foi útil?

Solução

Acontece que foi fácil.Eu só tive que zombar de um método obrigatório.

it('should do a searchquery if term length is equal or bigger then min-chars', function () {
    $scope.minChars = 3;
    $scope.search = function (term) {
        return term;
    };
    spyOn($scope, 'search');
    $scope.query('bes');
    expect($scope.search).toHaveBeenCalledWith({term: 'bes'});
});
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top