Хорошо, поэтому я долго спотыкался о какой-то проблеме, и мне хотелось бы услышать мнение от остальной части сообщества.
Сначала рассмотрим некоторый абстрактный контроллер.
function Ctrl($scope, anyService) {
$scope.field = "field";
$scope.whenClicked = function() {
util();
};
function util() {
anyService.doSmth();
}
}
Ясно, что мы имеем здесь:
- регулярный эшафот для контроллера с
$scope
и некоторая служебная инъекция - некоторое поле и функция, прикрепленные к области
- частный метод
util()
Теперь я хотел бы осветить этот класс в модульных тестах (Жасмин). Однако проблема в том, что я хочу проверить, что при щелчке (вызов whenClicked()
) какой-либо элемент, который будет вызываться методом util()
. Я не знаю, как это сделать, поскольку в тестах Jasmine я всегда получаю ошибки, которые либо макет для util()
не был определен или не был вызван.
Примечание. Я не пытаюсь исправить этот конкретный пример, я прошу о тестировании такого кода в целом. Поэтому, пожалуйста, не говорите мне, "что такое точная ошибка". Я спрашиваю, как это сделать, а не как это исправить.
Я пробовал несколько способов обойти это:
- Очевидно, я не могу использовать
$scope
в своих модульных тестах, поскольку у меня нет этой функции, прикрепленной к этому объекту (обычно она заканчивается сообщениемExpected spy but got undefined
или аналогичным) - Я попытался привязать эти функции к объекту контроллера через
Ctrl.util = util;
, а затем проверил mocks какCtrl.util = jasmine.createSpy()
, но в этом случаеCtrl.util
не вызывается, поэтому тесты терпят неудачу - Я попытался сменить
util()
на объектthis
и снова высмеятьCtrl.util
, не повезло
Ну, я не могу найти способ обойти это, я бы ожидал некоторой помощи от ниндзя JS, рабочая скрипка была бы идеальной.