我写简化测试来研究如何测试编译指令 但我不能让它发挥作用:
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
来电。
答案 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");
});