volkov_p_v
@volkov_p_v
FrontEnd разработчик

Как в angular тестировать логику с данными, которые приходят с сервера?

Мне нужно протестировать логику с данными, которые приходят с сервер, в контроллере. Но я не понимаю как нужно правильно написать тесты с mocha+chai.

Мой код:
angular
  .module('WebApp', [])
  .factory('api', function($q, $http){
	  return function(type, url, data){
		var deferred  = $q.defer(),
		  url       = 'ConfigBaseUrl' + url; //'ConfigBaseUrl' меняется таской gulp-а из конфигурационного файла.
			  
		switch (type){
		  case 'GET':
			$http.get(url)
			  .success(function (data) {
				deferred.resolve(data);
			  })
			  .error(function (data) {
				deferred.reject(data);
			  });
			  break;
		  case 'PUT':
			$http.put(url, data)
			  .success(function (data) {
				deferred.resolve(data);
			  })
			  .error(function (data) {
				deferred.reject(data);
			  });
				break;
		  case 'POST':
			$http.post(url, data)
			  .success(function (data) {
				deferred.resolve(data);
			  })
			  .error(function (data) {
				deferred.reject(data);
			  });
				break;
		  case 'DELETE':
			$http.delete(url, data)
			  .success(function (data) {
				deferred.resolve(data);
			  })
			  .error(function (data) {
				deferred.reject(data);
			  });
				break;
		  default:
				console.log('');
				return;
		}

		return deferred.promise;
	  }
  })
  .service('serverApi', function(api){
	    this.getList = function (url) {
			return api('GET', url);
		};
  })
  .constant('URL', {
    LIST:           '/api/list'
  })
  .controller('listCtrl', function($location, serverApi){
	  var pathLocation = $location.path(),
	  
	  pathLocation = pathLocation.split('/');
	  
	  serverApi.getList(URL.LIST+'/'+pathLocation[2]).then(successDataTable, errorDataTable);
	  
	  function successDataTable(response){
		  //some logic
	  }
	  
	  function errorDataTable(response){
		  //some logic
	  }
  });


И код теста:

describe('CONTROLLER: listCtrl', function() {
	    var scope        = null,
		    vm           = null,
			$q           = null,
			deferred     = null,
			$httpBackend = null;
			
		beforeEach(module('WebApp'));

	  beforeEach(inject(function($rootScope, $controller, _$q_, _$httpBackend_) {
		$q          = _$q_;
		scope       = $rootScope.$new();
		deferred    = _$q_.defer();
		$httpBackend = _$httpBackend_;
		vm          = $controller('gameCtrl', {$scope: scope});
	  }));

	  it('exist controller', function(){
		expect(vm).to.exist;
	  });
	  
	  it('send json data in successDataTable', function(){
		  //Что мне тут нужно написать?
	  });
  })


В интернете есть примеры для jasmin, но я использую mocha+chai.
Подскажите пожалуйста как в тесте правильно передать данные в формате json для successDataTable.
  • Вопрос задан
  • 432 просмотра
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1) запихиваем $http в сервисы
2) мокаем эти сервисы
3) сами сервисы работающие с сетью либо тестируем в рамках e2e тестов либо через $httpBackendMock. Но юнит тестами покрывать их смысла особо нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы