我的Jasmine测试不喜欢在我的控制器中使用$pristine
和$valid
并输出以下错误:
TypeError:'范围[...]。$ pristine'是null或不是对象
启动此错误的测试如下:
it('should validate values correctly', function () {
var scp = ngElement.scope();
var tests = [
{
valid: true,
validationOptions: {
required: true
},
value: '1'
}
];
$.each(tests, function (testIndex, testItem) {
scp.name = 'test';
scp.value = testItem.value;
$.each(testItem.validationOptions, function (itemKey, itemValue) {
scp[itemKey] = itemValue;
});
scp.change();
expect(scp.valid).toBe(testItem.valid);
});
});
具有$ pristine和$ valid状态的控制器中的函数如下:
// Field change behaviours
scope.change = function () {
validate();
...
};
// Field level validation function
function validate () {
// If the field does not have a value and is pristine, scope.valid is undefined.
// Otherwise the field is validated
if ((!scope.value || scope.value.length === 0) && scope[scope.name].$pristine) scope.valid = undefined;
else scope.valid = scope[scope.name].$valid;
...
}
答案 0 :(得分:4)
在视图上定义表单时,formcontroller将使用表单名称属性中指定的名称注入控制器。
由于您的单元测试没有创建实际视图,因此您唯一的选择是创建一个虚拟表单控制器以及您在该作用域上手动访问的属性。像
这样的东西scp.formName={}; // formName should be the same that you refer with `scope.name`
scp.formName.$pristine=true; // set value according to the test
scp.formName.$valid=true; // set value according to the test.
记住你不想测试form指令是否正常工作。它已经用框架进行了测试,