鉴于以下指令,可以解释为什么以下测试失败? DEMO
指令
angular.module('plunker').directive('maybeLink', function($compile) {
return {
scope: {
maybeLink: '=',
maybeLinkText: '='
},
link: function(scope, element, attrs) {
scope.$watch('maybeLinkText', function(newVal) {
scope.text = newVal.replace(/\n/g, '<br>');
});
scope.$watch('maybeLink',function() {
var newEl;
if (scope.maybeLink) {
newEl = $compile('<a href="#">{{ text }}</a>')(scope);
} else {
newEl = $compile('<span>{{ text }}</span>')(scope);
}
element.replaceWith(newEl);
element = newEl;
});
}
};
});
TEST
describe('Directive: maybeLink', function() {
var scope, $compile;
beforeEach(function() {
module('plunker');
inject(function($rootScope, _$compile_) {
scope = $rootScope;
$compile = _$compile_;
});
});
function compile(html) {
var element = $compile(html)(scope);
scope.$digest();
return element;
}
it('should create a link when link URL exists', function() {
scope.myLinkText = 'Great Video';
scope.myLinkURL = 'http://www.youtube.com/watch?v=rYEDA3JcQqw';
var element = compile('<span maybe-link="myLinkURL" maybe-link-text="myLinkText"></span>');
console.log(element[0].outerHTML); // => <span maybe-link="myLinkURL" maybe-link-text="myLinkText" class="ng-isolate-scope ng-scope"></span>
console.log(element.html()); // => (empty string)
expect(element.text()).toBe('Great Video');
expect(element.find('a').length).toBe(1);
});
});
答案 0 :(得分:6)
如果您在指令代码中将element.replaceWith(newEl);
更改为element.append(newEl);
,则测试将通过。所以你需要的是在测试中使用额外的HTML包装器传递模板。
因此,只需将模板包含在带有div
的测试代码中或者像这样的有效HTML元素中,测试就应该通过。
var element = compile('<div><span maybe-link="myLinkURL" maybe-link-text="myLinkText"></span></div>');