Автор оригинала: Faizan Haider.
Нам нужно изучать тестирование подразделения для TDD. Требуется предыдущее знание Angularjs и JavaScript. Первый вопрос, который приходит в ум, так это почему TDD (разработка тестирования)? Это означает первые тестовые случаи записи, а затем разрабатывают свой код, чтобы пройти этот конкретный тестовый случай. Я думаю, что TDD очень важен при написании чистого, поддерживаемого и краткого кода. TDD дает вам:
- Уверенность в вашем коде
- Нет дубликата кода
- Поддерживает чистое хорошее качество
- Нет мертвого кода. Нет функций или линии кода, которая не используется.
- Эти тесты могут быть документациями для других разработчиков, поддерживающих ваш код. И многое другое.
Написание тестовых приложений требуется:
- Написание теста
- Неспособность теста
- Напишите код, чтобы пройти тест
- Запустите тест снова
Эта статья связана только для написания тестов для Angularjs, связанным с кодом, использующим NGMock. Мы будем использовать жасмин (тестовые рамки). Жасмин дает нам следующие функции:
- Опишите («Test Suite», функция () {})//для группировки связанных тестов
- Это («имя теста», функция () {})
- Foreeafee (), Upoted ()//Для проведения общего раздела групповых тестов
- Ожидайте (). Тотбе, Тотэка, Тотроу, а не, Тохавенценцилуэндвит//для утверждения
Мы будем тестировать ниже упомянутых основных принципов Angularjs, используя NGMock. NGMOCK разработан угловой командой.
- Модули
- Контроллер
- Услуги
- Директивы
- Фильтры
Основные функции Ngmock
Мы будем использовать Angular.mock.module (псевдоним, анонимность, анонимообъект) и angular.mock.inject () для тестирования нашего кода.
- angular.mock.module () – мы будем использовать это, чтобы загрузить наш модуль (ы) для целей тестирования. Потому что Angular.mock.module доступен в качестве глобального объекта, мы можем просто использовать модуль ()
- Angular.mock.inject () – мы будем использовать это, чтобы получить экземпляры компонентов (контроллер, услуги, фильтры, директивы и т. Д.) Из модулей для тестирования. Потому что Angular.mock.inject () доступен как глобальный объект, мы можем просто использовать ввод ()
Контроллер тестирования
angular.mock.inject () предоставить нам $ контроллер Сервис, который является декоратором для контроллера с дополнительными параметрами связывания для получения контроллера, чтобы проверить его.
$controller(constructor, // string or function locals, // $scope object and other injectables [bindings] //object for controllerAs binding );
Например, вы хотите проверить контроллер
angular.module('testApp') .controller('simpleController', function($scope, $location) { $scope.search = function() { if ($scope.query) { $location.path('/results').search('q', $scope.query); } } });
Вы бы написали что-то подобное;
describe('Simple Controller', function() { var $location; var $scope; beforeEach(angular.mock.module('testApp')); beforeEach(angular.mock.inject(function(_$controller_, _$location_,) { //Using inject to get _$controller_ service $scope = {}; $location = _$location_; _$controller_('simpleController', { //sinple controller $scope: $scope, $location: _$location_ }); })); it('should redirect to query results for non-empty query', function() { $scope.query = 'Hello'; $scope.search(); expect($location.url()).toBe('/results?q=Hello'); }); it('should not redirect to query results for empty query', function() { $scope.query = ''; $scope.search(); expect($location.url()).toBe(''); }); });
Директивы тестирования
Мы будем использовать Компилировать () Сервис, данный angula.mock.inject () для компиляции HTML-строки в функцию шаблона, которая будет использоваться для связи с помощью шаблона. Мы также бы использовали $ rofsscope от Angular.mock.inject () для объема. Например, тестирование ниже Директивы
angular.module('testApp') .directive('simpleResult', function() { return { restrict: 'E', replace: true, scope: { result: '=result' }, template: [ '', '' ].join('') }; });{{result.Title}}
', '
Мы сделаем что-то вроде этого:
describe('Simple Result Directive', function() { var result = { Title: 'Testing what is here' }; var expectedHtml = [ '', '' ].join('') var $compile; var $rootScope; beforeEach(module('testApp')); //loading Testing module beforeEach(inject(function(_$compile_, _$rootScope_) { //$compie and $rootScope services $compile = _$compile_; $rootScope = _$rootScope_; })); it('should output result to expected HTML format', function() { $rootScope.result = result; var element = $compile('Testing what is here
', '')($rootScope); $rootScope.$digest(); //For executing digest life cycle for angular expect(element.html()).toBe(expectedHtml); }); });
Тестирующие услуги с HTTP CONSES на Backend
Для служб тестирования их можно вводить через angular.mock.inject () с _ exampleserviCename _.
angular.module('dbCalls', []) .factory('seachApi', function($http, $q) { var service = {}; var baseUrl = 'http://someurl.com/?'; service.search = function(query) { var deferred = $q.defer(); $http.get(baseUrl + 's=' + encodeURIComponent(query)) .success(function (data) { deferred.resolve(data); }).error(function (e) { deferred.reject(e); }) return deferred.promise; } return service; });
Вы бы написали что-то вроде этого:
describe('dbCalls service', function() { var data = {"Search":[{"Title":"Testing what is here"}]}; var searchApi = {}; var $httpBackend; var $exceptionHandler; beforeEach(module('dbCalls')); beforeEach(inject(function(_searchApi_, _$httpBackend_, _$exceptionHandler_) { searchApi = _searchApi_; //Getting search Api service with this kind naming convension $httpBackend = _$httpBackend_;//Using this service to prepare call for testing $exceptionHandler = _$exceptionHandler_; //Using this service for handling exceptions })); it('should return search movie data', function() { var response; var expectedUrl = 'http://someurl.com/?&s=hello'; $httpBackend.when('GET', expectedUrl) // For testing purpose, mocking out response. .respond(200, data); searchApi.search('hello') //Calling services with .then(function(data) { response = data; }); $httpBackend.flush(); //Run request as sync expect(response).toEqual(data); });
Тестирование фильтров
angular.mock.inject () предоставить нам $ фильтр Сервис, который является декоратором для фильтра для получения фильтра для проверки его.
angular.module('testApp') .filter('upperCase', function upperCaseFilter() { return function (value) { return value.toUpperCase(); }; }); // Unit test for this filter describe('Upper Case Filter', function() { var upperCase; beforeEach(module('testApp')); beforeEach(inject(function (_$filter_) { upperCase = _$filter_('upperCase'); })); it('should return upper case value for string', function() { expect(upperCase('foo')).toBe('FOO'); }); });
С знанием услуг, предоставляемых Angular.Mock (), вы можете установить тест на что-либо, связанное с Angularjs. Мы смотрели в Контроллер_, _Compile , $ фильтр Услуги для тестирования контроллеров, директивы, фильтры и услуги. Мы всегда должны писать тестовые случаи, но сколько нужно проводить тестирование, это дискуссия на другой день.