如何测试angular $ compile结果?

时间:2015-11-16 12:36:53

标签: angularjs unit-testing karma-jasmine

我写简化测试来研究如何测试编译指令 但我不能让它发挥作用:

    fit('debug compile', function(){
        var el = compile('<div></div>')(scope);

        backend.expectGET('/index.tpl');

        scope.name = 'World';
        scope.$digest();

        http.get('/index.tpl').success(function(html){
            expect(html).toBe('<h1>Hello, {{name}}!</h1>'); //ok
            var compiled = compile(html)(scope);
            expect(scope.name).toBe('World'); // ok
            expect(compiled.text()).toBe('Hello, World!'); // Expected 'Hello, {{name}}!' to be 'Hello, World!'
        });
        backend.flush();
    });

此处发生了什么:$http$httpBackend收到正确的模板 但是当我使用$compile编译它时,它会在没有范围替换的情况下呈现。

如何在这里实现正确的行为?

如您所见,范围变量不能替代此处 我在编译后尝试添加scope.$digest,但它给了我另一个错误digest in progress 我认为,这来自$http scope.$apply来电。

2 个答案:

答案 0 :(得分:1)

由于它不是异步代码,因此解包承诺

List<Super>

只有这样

var html;
http.get('/index.tpl').then(function(result){
    html = result;
});
backend.flush();

var compiled = compile(html)(scope); scope.$digest(); expect(scope.name).toBe('World'); expect(compiled.text()).toBe('Hello, World!'); 是多余的,根本不必在这里,除非您希望测试Angular服务(并且您很可能不会)。

答案 1 :(得分:1)

我使用指令测试创建了codepen

  it('assigns "anonimous" to the name', function() {
    var $scope = $rootScope.$new();
    var $el = $compile('<div test-dir></div>')(scope);
    $scope.$digest();
    expect($el.text()).toBe("Hello anonymous");
  });