我有一个包含以下输入的表单:
<input type="email" name="email" ng-model="register.form.email" ng-pattern="emailRegex">
如果用户输入无效的电子邮件,我想测试表单无效:
it('...', function() {
form.email.$setViewValue('invalid');
expect(form.email.$valid).toBeFalsy(); // OK
form.email.$setViewValue('invalid@');
expect(form.email.$valid).toBeFalsy(); // OK
form.email.$setViewValue('invalid@host');
expect(form.email.$valid).toBeFalsy(); // Not OK
});
最后的期望失败是因为输入有效,尽管电子邮件正则表达式需要一个域。感觉好像我的测试中没有使用该模式,因为当我将类型更改为文本时,它已经在第一次期望时失败了。如何确保在测试中拾取模式?
为了完整,这是正则表达式(不是我写的):
^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@[_A-Za-z0-9]+[_A-Za-z0-9-]*[_A-Za-z0-9]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$
将类型更改为text
无效。
我使用的是jasmine 2.4.1和angular 1.4.2。我正在使用ngHtml2JsPreprocessor解释here来初始化我的测试中的表单。
修改
这是如何形成初始化:
beforeEach(inject(function($rootScope, $templateCache, $compile) {
var $scope = $rootScope.$new();
vm = $controller('RegisterController', {$scope: $scope});
var templateHtml = $templateCache.get("register.html");
var template = angular.element("<div>" + templateHtml + "</div>");
$compile(template)($scope);
var form = $scope.registerForm;
$scope.$apply();
scope = $scope;
}));
答案 0 :(得分:2)
AngularJS仍然有效,如何开发
angular.module('app', [])
describe('Registration form', () => {
'use strict'
beforeEach(module('app'))
let form
let scope
beforeEach(inject(($rootScope, $compile) => {
scope = $rootScope.$new()
var formElem = ['<form name="registrationForm">',
'<input type="text" name="number" ng-model="input" ng-pattern="/^[_A-Za-z0-9-]+(\.[_A-Za-z0-9-]+)*@[_A-Za-z0-9]+[_A-Za-z0-9-]*[_A-Za-z0-9]+(\.[A-Za-z0-9]+)*(\.[A-Za-z]{2,})$/">',
'</form>'
].join('')
$compile(formElem)(scope)
form = scope.registrationForm
}))
it('has no `$valid` state', () => {
expect(form.$valid).toBeTruthy()
form.number.$setViewValue('invalid email address')
expect(form.number.$valid).toBeFalsy()
})
it('has `$valid` state', () => {
expect(form.$valid).toBeTruthy()
form.number.$setViewValue('some@valid.address')
expect(form.number.$valid).toBeTruthy()
})
})
&#13;
<script src="https://safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-mocks.js"></script>
<link href="https://safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" />
&#13;
答案 1 :(得分:0)
我认为您应该在使用scope.$digest();
之后调用form.email.$setViewValue
,scope
将传递给您的$ compile的范围。这就是我在每次测试中使用的。
您还可以在此处查看更多信息:https://stackoverflow.com/a/22772504/4583079