Как модульное тестирование фильтра в AngularJS 1.икс
Как вы блок тестируете фильтр в угловой?
5 ответов:
Inject
$filter
и затем вызвать его с$filter('filterName')(input, options);
чтобы проверить эквивалент этого шаблона
{{ foo | testFilter:capitalize }}
describe('The test filter', function () { 'use strict'; var $filter; beforeEach(function () { module('myTestFilterModule'); inject(function (_$filter_) { $filter = _$filter_; }); }); it('should capitalize a string', function () { // Arrange. var foo = 'hello world', result; // Act. result = $filter('testFilter')(foo, 'capitalize'); // Assert. expect(result).toEqual('HELLO WORLD'); }); });
вы можете ввести $filter и загрузить фильтр, который вы хотите проверить. Затем вы передаете параметр для фильтрации через фильтр, который вы ввели, и вы "ожидаете" то, что вам нужно. Вот пример:
describe('Filter test', function(){ var filter; beforeEach(function(){ module.apply(moduleName); inject(function($injector){ filter = $injector.get('$filter')('nameOfTheFilter'); }); }); it('should filter the parameters passed', function(){ expect(filter(parameterToBeFiltered)).toBe(Result); }); });
фильтр может быть введен прямо в тесте (нашли фрагмент здесь)
describe('myApp', function () { beforeEach(function () { module('myApp'); }); it('has a bool filter', inject(function($filter) { expect($filter('bool')).not.toBeNull(); })); it("should return true empty array ", inject(function (boolFilter) { expect(boolFilter(true)).toBeTruthy(); })); });
в этом примере имя фильтра 'bool', чтобы ввести этот фильтр, вы должны использовать 'bool' + 'Filter' = 'boolFilter'
есть и другие способы проверить фильтр, кроме инъекции фактического
$filter
сервис.пример:
describe('FILTER: myFilterName', function(){ // You can put anything in the string here, // I like declaring FILTER: myFilterName, but it // could be just the filter name. var myTestTheFilterVariableName; // This variable does not have to match the describe name, call it what you wish, // but use this variable in any it blocks below. beforeEach(module('obsidian')); // Include app - boilerplate. beforeEach(inject(function(actualFilterNameFilter){ // If your test variable name is the same as 'actualFilterNameFilter' then you would // use this name '_actualFilterNameFilter_' with underscores; The Angularjs injector will // remove the underscores for you. // IMPORTANT PART: The important part here is the trailing 'Filter' name. This is how Angularjs // Knows to grab the filter title "actualFilterName" in this case. myTestTheFilterVariableName = actualFilterNameFilter; })); // This is where you actually include the filter for testing. // Use the underscores if your variable name is the exact same as the injected parameter. // This is where you would use your variable name from above. it('should do something here', function(){ expect(myTestTheFilterVariableName(filterParameter)).toEqual(expectedResultHere); }); });
здесь у вас есть запускаемый тестовый пример фильтра.
angular.module('myModule', []).filter('multiplier', function() { return function(number, multiplier) { if (!angular.isNumber(number)) { throw new Error(number + " is not a number!"); } if (!multiplier) { multiplier = 2; } return number * multiplier; } }); describe('multiplierFilter', function() { var filter; beforeEach(function() { module('myModule'); inject(function(multiplierFilter) { filter = multiplierFilter; }); }); it('multiply by 2 by default', function() { expect(filter(2)).toBe(4); expect(filter(3)).toBe(6); }); it('allow to specify custom multiplier', function() { expect(filter(2, 4)).toBe(8); }); it('throws error on invalid input', function() { expect(function() { filter(null); }).toThrow(); }); });
<link href="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.4.1/jasmine.css" rel="stylesheet"/> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.8/angular.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.4.1/jasmine.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.4.1/jasmine-html.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jasmine/2.4.1/boot.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular-mocks.js"></script>
Примечание: этот ответ был создан после так документация закат на основе примера фильтра модульного теста AngularJS и предложения по Meta, что все ценное содержимое документации должно быть преобразовано в ответы.