2015-11-11 2 views
1

У меня есть контроллер, который в настоящее время вызывает API RESTful при загрузке связанного представления. Таким образом, я не уверен, связана ли эта проблема с тем, как я тестирую, или с реализацией самого кода. Я был бы доволен любыми предложениями, которые бы решали проблему целостно, то есть помогать мне, тестовый код, который делает то, что я хочу :)AngularJS: Как отключить функцию внутри контроллера, который я тестирую с помощью модуля?

Вот несколько примеров, чтобы проиллюстрировать мою точку зрения:

контроллер:

angular.module('app.myModule',[]) 
.controller('MyController', function($scope) { 

    $scope.notTestingThis = function() { 
    var thisFails = $scope.do.not.want.to.mock.these.objects.substr(0,10); 
    }; 

    $scope.testingThis = function(myString) { 
    $scope.newString = myString; 
    }; 

    $scope.notTestingThis(); 

}); 

испытания (как он стоит):

describe('MyControllerTest', function() { 

    beforeEach(module('app.myModule')); 

    var $controller; 

    beforeEach(inject(function(_$controller_) { 
    $controller = _$controller_; 
    })); 

    describe('$scope.testingThis()', function() { 

    it('sets newString', function() { 
     $scope = { 
     'notTestingThis': {} 
     }; 
     var myController = $controller('MyController', {$scope: $scope}); 
    }); 

    }); 

}); 

При загрузке этого представления мне нужно вызвать notTestingThis, так или иначе, однако в моем модульном тесте я хочу выделить testingThis. Проблема в том, что когда я инициализирую контроллер в своем тесте, он, конечно, вызовет notTestingThis и попытается выполнить действия над объектами, которые не существуют (и которые мне не нужны в этом тесте).

Очевидно, что попытка вырезания функции, о которой идет речь в этом примере, бесполезна, так как при инициализации будет переписана область $. Есть ли способ заглушить или издеваться над отдельными функциями в контроллере, который вы пытаетесь проверить, или я пропустил точку где-то? Некоторые предположения, что коллега выдвигаемые были:

Enhance контроллер, чтобы быть в курсе самого модульного тестирования, что позволяет регулировать ход выполнения программы на основе введенного издеваться, то есть что-то вроде следующего в контроллере:

if (!$scope.methodA) { 
    $scope.methodA = function() {...} 
} 

... или ...

изменить способ notTestingThis функция вызывается, слушая к событию инициализации от $ rootScope вместо вызова непосредственно, которая позволила бы мне дразнить $ rootScope так, что он не вызывает это событие, тем самым предотвращая notTestingThis от призыва

Я могу» Мне кажется, что я думаю об этом неправильно. Какие-нибудь идеи?

ответ

0

Просто удвоитесь назад по этому запросу, если другие придут к нему.Я посмотрел на обоих рекомендаций, внедрение и с некоторыми различиями в моих оригинальных комментариях (как я понял рекомендации), а именно:

Вариант 1

Вместо того, чтобы оборачивать каждую функцию, перенесите код вызова в:

if(!testingBoolean) { $scope.notTestingThis(); }; 

с testingBoolean ложным, если передается в качестве (необязательного) аргумент к контроллеру, что позволяет код тестирования, чтобы предотвратить вызовы

Вариант 2:

$ передается от $ rootScope с использованием сервисной функции. Оберните вызывающий код в слушателе на этом событии, затем вызовите функцию из контроллера. Издевательство над $ rootScope при выполнении тестов предотвратит запуск функции notTestingThis.

Реальное решение

Эти подходы, похоже, было отвлечение однако; хотя это явно не указано нигде, похоже, что контроллеры не должны сами вызывать функции. Правильный путь сюда - это перепроектировать дизайн приложения, чтобы директивы вызывали функции через связывание, что упрощало модульное тестирование.

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