AngularJS: Как издеваться над FormController, введенным в область видимости?

У меня есть логика проверки правильности внутри контроллера, и я хотел бы unit test эту логику.

Дело в том, что я не знаю, как издеваться над контроллером формы, который автоматически вводится в область.

Любая идея?

Ответ 1

AFAIK, вы можете попробовать 2 подхода:

  • используйте службу $compile и скомпилируйте свой шаблон с соответствующим $scope (не забывайте co all $scope.$apply() после компиляции). Grunt html2js - отличный инструмент для предварительной обработки ваших шаблонов и добавления их в шаблон angular $templateCache до выполнения теста. См. Домашнюю страницу проекта https://npmjs.org/package/grunt-html2js

  • используйте службу $controller и вручную вставьте FormController в $scope. Но вам также нужно будет ввести все NgModelControllers, которые вы обычно использовали в своем шаблоне.

Ответ 2

Как насчет того, чтобы издеваться над формой AngularJS, а затем тестировать состояние $грязное и $valid:

// example usage of html form element
<form data-ng-submit="update()" name="optionsForm" novalidate="novalidate">

// example usage html button element
<button type="submit" ng-disabled="!canSave()">Update Options</button>

// Controller check if form is valid
$scope.canSave = function () {
    return $scope.rideshareForm.$dirty && $scope.rideshareForm.$valid;
};

// Unit Test

// scope is injected in a beforeEach hook
it('$scope.canSave returns true if an options form is valid or false if non-valid', function() {

// mock angular form
scope.optionsForm = {};

// valid form
scope.optionsForm.$dirty = true;
scope.optionsForm.$valid = true;
expect(scope.canSave()).toBe(true);

// non-valid form
scope.rideshareForm.$dirty = true;
scope.rideshareForm.$valid = false;
expect(scope.canSave()).toBe(false);

});