使用Jasmine测试Angular的$ valid和$ pristine状态

时间:2015-04-07 04:13:50

标签: angularjs validation unit-testing jasmine

我的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;

        ...
    }

1 个答案:

答案 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指令是否正常工作。它已经用框架进行了测试,