该问题可能是因为Angular Elements的测试仅在单元测试模式下运行,无法模拟在浏览器中注册自定义元素的场景。解决方法是使用@angular/elements库提供的createCustomElement()函数来生成自定义元素,然后在浏览器中手动注册它们。
以下是一个示例组件和测试代码,演示如何通过手动注册自定义元素来解决问题:
import { Component, Injector } from '@angular/core';
import { createCustomElement } from '@angular/elements';
@Component({
selector: 'my-custom-element',
template: `Hello, {{ name }}!
`,
})
export class MyCustomElementComponent {
name = 'World';
}
// Register the custom element with the browser
const MyCustomElement = createCustomElement(MyCustomElementComponent, {
injector: Injector.create({ providers: [] }),
});
customElements.define('my-custom-element', MyCustomElement);
describe('MyCustomElementComponent', () => {
beforeEach(() => {
// Manually register the custom element before each test
customElements.define('my-custom-element', MyCustomElement);
});
it('should render', () => {
const element = document.createElement('my-custom-element');
document.body.appendChild(element);
expect(element.querySelector('h1').textContent).toContain('Hello, World!');
});
});
在上述示例中,我们使用createCustomElement()函数来创建一个自定义元素,该元素包含MyCustomElementComponent组件作为其模板,并使用Injector创建一个注入器。然后,我们手动将该元素注册到浏览器中。在测试之前和每个测试之前,我们都需要手动将元素注册到customElements中。
这个解决方案不仅可以解决测试时的问题,还可以允许您将Angular Elements嵌入其他框架或非Angular应用程序中。