2

У меня есть Угловой с Ui-маршрутизатором, так toResolve переменное будут решен в моем SomeControllerМетод испытания Угловой решительность

.state('some.state', { 
     url: '/some', 
     controller: 'SomeController', 
     templateUrl: '/static/views/some-state.html', 
     resolve: { 
     toResolve: function(Resource) { 
      return Resource.get(function(response) { 
      return response; 
      }); 
     }, 

Но как проверить эту функциональность с Жасмин? Предположим, что я забыл заявление return, поэтому toResolve в моей области будет undefined.

+0

Почему вы хотите, чтобы проверить внутреннюю функциональность AngularJS, вероятно, он работает в идеальном виде –

+0

Это не внутренность, это простой тестовый пример, например 'ожидать ($ scope.toResolve) .not.toBeUndefined();' когда я могу пропустить возвращение, например –

+0

@KrzysztofSafjanowski: во всяком случае, все должно быть проверено и если я хочу, чтобы я мог издеваться над любым компонентом и тестировать любую комбинацию те, независимо от того, являются ли они внутренними или нет –

ответ

1

Используйте сервисы, чтобы сделать решатели эффективными для тестирования (а также имитируемыми в тестах интеграции/e2e).

Примечание: Угловые услуги - это одноточие, состояние/распознаватели маршрутов - нет.

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

app.factory('someResolver', function(Resource) { 
    return Resource.get(function(response) { 
    return response; 
    }) 
}); 
... 

resolve: { toResolve: 'someResolver' }, 

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

app.constant('someResolver', ['Resource', function(Resource) { 
    return Resource.get(function(response) { 
    return response; 
    }) 
}]); 

app.config(function (someResolver, ...) { 
    ... 
    resolve: { toResolve: someResolver }, 
    ... 

В противном случае данные могут положить конец обременены кучей шаблонного кода:

var toResolveFactory = $state.get('some.state').resolve.toResolve; 
var toResolve = $injector.invoke(toResolveFactory); 
+0

Отлично, это именно то, что я искал. Еще один маленький вопрос для вас: откуда появился «инжектор» в моей спецификации? –

+1

@MostWanted Вам нужно будет ввести «$ инжектор» в спецификацию, чтобы протестировать «константу» и «$ state.get ...» ароматизаторы резольверов (не обязательно для 'factory'). – estus

0

Одна хорошая статья по соответствующей теме - http://nikas.praninskas.com/angular/2014/09/27/unit-testing-ui-router-configuration/, но это не решение. Одна идея состоит в том, чтобы передать другой объект resolve, а затем проверить эту единицу кода отдельно, что хорошо, когда вы разрешаете кучу элементов.

Смежные вопросы