我有一个在控制器中定义的方法。此方法传递给具有隔离范围的自定义指令。如何正确测试$scope.search
的实现?
$scope.query = function (term) {
// some async stuff
};
<div ng-controller="AutocompleteCtrl">
<div typeahead data-search="query(term)"></div>
</div>
return {
controller: 'AutocompleteDirectiveCtrl',
scope: {
search: '&'
}
}
$scope.query = function (term) {
if (term.length > ($scope.minChars - 1)) {
$scope.search({term: term});
}
};
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');
});
});
});
TypeError: 'undefined' is not a function (evaluating '$scope.search({term: term})')
答案 0 :(得分:0)
事实证明这很简单。我只需要模拟一个必需的方法。
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'});
});