Pregunta

Tengo un método que está definido en un controlador.Este método se pasa a una directiva personalizada que tiene un alcance aislado.¿Cómo pruebo la implementación de $scope.search ¿correctamente?

Autocompletar Ctrl

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

Plantilla

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

Directiva (extracto)

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

AutocompletarDirectivaCtrl

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

Prueba de unidad

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})')
¿Fue útil?

Solución

Resulta que fue fácil.Sólo tuve que burlarme de un método requerido.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top