为什么在测试时没有设置范围值?

Why does the scope value not get set when testing?

我已经使用 angular 1.4.4:

为我的指令创建了一个单元测试
angular.module('myApp', [])
    .directive('uiList', [
        function() {
            return {
                scope: {
                    lengthModel: '=uiList'
                },
                link: function(scope, elm, attrs) {


                    scope.$watch('lengthModel', function(newVal) {
                        scope.test=2;
                        console.log('kut');

                    });
                }
            };
        }
    ]);

这是我的测试:

describe('Testing $emit in directive', function() {
    var scope;
    var element;
    var elementScope;

    beforeEach(module('myApp'));

    beforeEach(inject(function($rootScope, $compile) {
        scope = $rootScope.$new();
        scope.row = 1;
        element = angular.element('<ul id="rows" ui-list="row">');
        $compile(element)(scope);
        scope.$digest();
        elementScope = element.scope();
    }));

    it('should change value', function() {

        scope.$apply(function() {
            scope.row = 1;
        });

        expect(elementScope.test).toEqual(2);


    });

});

当我 运行 在 webstorm 中测试时,我得到这个错误:

Chrome 48.0.2564 (Mac OS X 10.10.5) Testing $emit in directive should emit FAILED              
        Expected undefined to equal 2.

我到达了指令的 watch 部分,因为当我 运行 karma 时,我可以看到日志 (=kut)。我怎样才能通过考试?

您将指令定义为使用独立作用域,因此我认为您应该 isolateScope() 而不是 scope() 来获取由指令在某些元素上创建的独立作用域

elementScope = element.isolateScope();

您还试图在新创建的范围上 assign/update row 属性 而您应该 assign/update row 属性 在包含指令的控制器的父范围上,因为您使用 lengthModel: '=uiList'.

lengthModel 指定了双向绑定

如本 example 所示,我建议您获得对独立作用域的引用,更新其上的一些属性并查看它们是否反映在您之前缓存的原始作用域对象中。

it('sample test case', function(){    

    var isolatedScope = element.isolateScope();
    isolatedScope.lengthModel = 10;

    expect(scope.test).toBe(1);
});