我在控制器内部发生了一些验证逻辑,我想对这个逻辑进行单元测试。
问题是我不知道如何模拟自动注入范围的表单控制器。
有什么想法吗?
答案 0 :(得分:5)
AFAIK,您可以尝试两种方法:
使用$compile
服务,并使用适当的$scope
编译模板(编译后不要忘记全部$scope.$apply()
)。 Grunt的html2js是一个很好的工具,可以预处理模板,并在测试执行之前将它们添加到angular的$ templateCache中。请参阅项目主页https://npmjs.org/package/grunt-html2js
使用$controller
服务,并将FormController
手动注入$scope
。但您还必须注入模板中通常具有的所有NgModelControllers
。
答案 1 :(得分:5)
如何模拟AngularJS表单然后测试表单$ dirty和$ 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);
});