golovewkin
@golovewkin
WEB - Разработчик

Как сделать заглушку для сервиса для тестов?

Еще раз всем привет.
Сразу скажу всем большое спасибо за помощь :)

Есть контроллер Angular
taskApp.controller('taskListCtrl', function ($scope, $rootScope, taskService) {

    taskService.getTaskList().then(function (data) {
        $rootScope.tasks = $scope.tasks = data.data;
    });
});


Как я понимаю, для того чтобы протестировать этот контроллер, нужно сделать заглушку для сервиса taskService , которая будет иметь свойство then которое будет возвращать любую строку (как пример), а задача теста будет проверить, что контроллер записал данные в скоуп.
Направьте пазязя.
  • Вопрос задан
  • 375 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1) не используйте $scope в контроллере. Y031. И тем более не используйте $rootScope. И тем более не используйте и то и то.

2) если мы выполним предыдущий пункт, у нас станет на 2 зависимости контроллера меньше, и проверять нам надо только состояние контроллера. В этом случае для теста достаточно просто взять нашу функцию и подменить зависимости через моки (если используете jasmine то там уже все есть, если используете mocha то тогда рекомендую sinon)

3) Продвинутое владение: Не используйте ngController или контроллеры стэйтов/роутов (максимум для прокидывания данных из ресолверов в скоуп). Дробить все на директивы. Причем данные прокидывайте в них сверху через биндинги а не запрашивайте прямо изнутри через сервисы. Тогда тестировать в нашем UI компоненте вообще ничего не надо будет. Достаточно биндинги проверить. А модель уже покрывать обычными тестами, ну и модель наша будет полностью отделена от angular-а (сервисы типа $http и контейнер зависимостей не в счет).

p.s. примерчик простенького приложения где все три пункта есть: вот.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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