我是 Karma 的初学者,如果这是一个愚蠢的问题,请原谅我。
我正在测试我的一个指令,这有两种特殊的方式:
1 - 它根据范围内容有条件地更改模板并重新编译链接器内的指令元素
var linker = function(scope, element, attrs) {
//...
var getTemplate = function(contentType) {
var template = '';
switch(contentType) {
case 'canvas':
template = '<div> stuff here </div>';
break;
case 'div':
template = '<div> other stuff here </div>';
break;
//...
}
return template;
};
var html = getTemplate(scope.content.uiType);
var ae = angular.element(html);
element.replaceWith(ae);
$compile(ae)(scope);
}
2 - 它在链接器中使用 jsplumb 来配置指令元素并设置一些 jsplumb 端点:
// Inside the linker function
var outEndPoint = jsPlumb.addEndpoint (ae, { /* parameters */ }, AudioOutPoint);
调用 jsPlumb.addEndpoint 时会出现问题。调试库,似乎在某个时刻,jsPlumb 使用 jQuery 返回某个元素 - 它创建的那个 - 通过 id,沿着 $("#jsplumb-element");
jQuery 依次执行 tis 行:
elem = document.getElementById( match[2] );
并且 getElementById 返回 null (可能是因为没有真正的 DOM?)。在这一点上,引发了一个异常,一切都崩溃了。
明确一点:如果我为此语句设置断点,并document.getElementsByTagName('div');
在控制台中执行,它将返回 null
.
我正在使用 Chrome 来测试这个指令,简单的测试代码是这样的:
describe('Directive: hyPluginWindow', function () {
beforeEach(module('hyacinthHostApp'));
var element, $compile, scope;
beforeEach(inject(function(_$compile_, $rootScope) {
$compile = _$compile_;
scope = $rootScope.$new();
}));
it('should set the right audioDestinations', inject(function () {
scope.content = {
name: "testElement",
id: "testElement000",
uiType: "canvas",
audioIn: 0,
audioOut: 1,
audioSources: [],
audioDestinations: []
};
var grandparent = angular.element('<div id="pluginArea"></div>');
var parent = angular.element('<div class="plugin"></div>');
var element = angular.element('<div hy-plugin-window content="content"></div>');
grandparent.append(parent);
parent.append(element);
debugger;
element = $compile(element)(scope);
expect(scope.audioDestinations.length).toBe(1);
}));
});
期望部分永远不会得到满足,因为指令一旦被链接就会除外。请注意,在应用程序中,此代码工作正常(因此问题出在测试指令中)。
我错过了什么?