指令表的测试失败;只是第一次开除

时间:2014-07-30 20:15:35

标签: angularjs angularjs-directive jasmine

我正在尝试使用jasmine为我的angularjs指令传递测试。

我的指令只是接受传递给属性的内容(作为单向绑定),并用该值替换元素文本。我的指令还会监视值的变化并相应地更新元素文本:

return {
    restrict: 'A',
    scope: {
        test: '&'
    },
    link: function (scope, element, attrs) {

        element.text(scope.test());

        scope.$watch('test', function (value) {
            console.log('WATCH FIRED!');
            element.text(scope.test());
        });
    }
};

我的jasmine测试尝试设置传递给指令的值,然后更改它,然后在更改值后检查元素文本是否不同:

it('should update when the model updates', function () {
    $scope.model = 'hello';
    $scope.$digest();
    var before = element.text();

    $scope.model = 'world';
    $scope.$digest();
    expect(element.text()).not.toEqual(before);
});

但是测试每次都失败了。事实上,元素文本总是“你好”,永远不会变成'世界'。

Plunker http://plnkr.co/edit/UeUGE88LuQRgeo7I412p?p=preview

1 个答案:

答案 0 :(得分:0)

这是因为您在指令(&)中使用单向绑定,因此不会跟踪对模型的更改。尝试使用双向绑定=,它应该按预期工作。

  

& binding允许指令在特定时间触发原始作用域上下文中表达式的求值。允许任何合法表达式,包括包含函数调用的表达式。因此,&绑定非常适合将回调函数绑定到指令行为。

 ...
return {
        restrict: 'A',
        scope: {
            test: '='
        },
        link: function (scope, element, attrs) {

            element.text(scope.text);

            scope.$watch('test', function (value) {
                console.log('WATCH FIRED!');
                element.text(scope.test);
            });
        }
    };

<强> Plnkr

或者您需要这样做: -

       scope.$watch(function(){
            return scope.test();
        }, function (value) {
            console.log('WATCH FIRED!');
            element.text(scope.test);
         });