Я пытаюсь написать модульные тесты для директивы, которая использует функцию ссылки и не имеет никакого связанного с ней шаблона. Директива требует ngModel
так:Mocking ngModel в модульных тестах
angular.module('some-module', []).directive('someDirective', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attr, controller) {
//Do something
}
};
});
При попытке модульного тестирования этого, я просто пытаюсь скомпилировать DIV, чтобы вызвать директиву:
var $scope = $rootScope.$new();
var element = $compile('<div some-directive></div>')($scope);
$scope.$digest();
Но это вызывает ошибку, что чем ngModel
контроллер не может быть найден. После просмотра документации ngModel и ngModelController Я попытался насмешливо ngModel
используя $provide
службы, как это:
beforeEach(module(function($provide) {
var mockNgModel = {};
$provide.value('ngModel', mockNgModel); //Doesn't work
$provide.value('ngModelCtrl', mockNgModel); //Doesn't work
$provide.value('ngModel.NgModelController', mockNgModel); //Doesn't work
$provide.value('ngModel.ngModelController', mockNgModel); //Doesn't work
}));
Я также видел другие решения, которые говорят о создании ресурса в объеме, который содержит все, что ngModel
является связанный в HTML, где используется ваша директива (например, solution1, solution2), но это не решило ошибку в моем случае.
Я по-прежнему получаю ту же ошибку. Это работает для вас? Если это так, мне может понадобиться определить другую проблему в моем коде. –
Да, это так, проверьте: https://jsfiddle.net/A8Vgk/1232/ Если я одержу ng-модель, я получаю описанную вами ошибку. – HankScorpio
Похоже, ты прав. По какой-то причине он пытается издеваться над «ngModel», который вызывает ошибку. Когда я удаляю эти строки и указываю 'ng-model' в теге HTML, я больше не получаю ошибку. Интересно, если вы не должны пытаться издеваться над «ngModel» в модульных тестах. –