как не дублировать код httpBackend в угловых тестах?

У меня есть некоторые службы, которые запрашивают данные при загрузке.

поэтому мои тесты терпят неудачу, потому что есть неожиданные вызовы, которые мне нужно указать в $httpBackend.

это вызывает много повторяющегося кода в моих тестах.

часть моих попыток уменьшить дублирующийся код, я решил добавить флаг $rootScope.test и если этот флаг стоит на тех сервисах не грузить данные но все же мне нужно дублировать $rootScope.test=true по всем тестам.

Есть ли способ сделать это правильно в угловых тестах?

Вот код

   $httpBackend.expectGET('/backend/system/translations/en.json').respond({'angularjs': 'cool'});
   $httpBackend.expectGET('/backend/system/translations/he.json').respond({'angularjs': 'cool'});
   $httpBackend.expectGET('/backend/system/translations/ru.json').respond({'angularjs': 'cool'});
   $httpBackend.expectGET('/backend/system/translations/ar.json').respond({'angularjs': 'cool'});
   $httpBackend.expectGET('/translations/general.json').respond({'angularjs': 'cool'});
    i18n = $filter('i18n');

Каждая директива, которая у меня есть с некоторой поддержкой перевода, требует этих утверждений для каждого языка.


person guy mograbi    schedule 12.09.2014    source источник
comment
Можете ли вы поставить код? По сути, вы можете установить регулярное выражение в $httpBackEnd для передачи полного пути к шаблонам или данным...   -  person benek    schedule 12.09.2014
comment
@benek, пожалуйста, смотрите код, добавленный к вопросу   -  person guy mograbi    schedule 13.09.2014


Ответы (1)


Чтобы обрабатывать каждый URL-адрес одним и тем же способом, попробуйте следующее:

$httpBackend.expectGET(function(url){
  return true;
}).respond({'angularjs': 'cool'});

Из документации первый аргумент expectGET:

URL-адрес HTTP или функция, которая получает URL-адрес и возвращает значение true, если URL-адрес соответствует текущему определению.

Если вы хотите определить ответ только на URL-адреса перевода, попробуйте следующее:

$httpBackend.expectGET(function(url){
   return url.lastIndexOf("/backend/system/translations/", 0) === 0;
}).respond({'angularjs': 'cool'});

Кроме того, вы уверены, что вам нужно использовать expectGET() вместо whenGET()? Если вам все равно, вызывались ли заданные URL-адреса или нет, сколько раз и в каком порядке, и вы просто хотите определить ответы, тогда методы when... - это путь:

См. раздел «Ожидания запросов и определения серверной части» на указанной странице документа.

Определения бэкенда позволяют вам определить фальшивый бэкэнд для вашего приложения, который не утверждает, был ли сделан конкретный запрос или нет, он просто возвращает обученный ответ, если запрос сделан. Тест будет пройден независимо от того, будет ли запрос сделан во время тестирования.

person Piotr Sobczyk    schedule 13.09.2014
comment
когда ответ для меня. Мое полное решение состоит в том, чтобы объявить модуль в другом файле, заполненном «когда». Когда я хочу подтвердить внутренние вызовы, я не включаю этот модуль в angular. Большое спасибо. - person guy mograbi; 13.09.2014