单元测试 LitElement 组件时如何正确存根元素?

如何解决单元测试 LitElement 组件时如何正确存根元素?

我正在尝试对 LitElement 组件进行单元测试。在尝试隔离组件时,我对如何实际存根元素感到困惑。也就是说,我找不到如何用空心元素替换适当元素的解决方案。
单元测试主题的聚合物项目提到this我没找到replace()函数的定义,看实现细节。实际上,“创建存根元素”标题中的聚合物项目所描述的正是我要寻找的。​​p>

元素定义文件

export class AppElement extends LitElement {
    render() {
        return html`
            <header-element class="header"></header-element>
            <div class="body">
                <menu-element></menu-element>
                <social-media-element></social-media-element>
                <contacts-element></contacts-element>
                <tap-list-element name="Fridge List" display="fridge"></tap-list-element>
                <tap-list-element route="tap" name="Tap List" display="tap" ></tap-list-element>
                <home-element></home-element>
                <about-us-element></about-us-element>
                <not-found-element></not-found-element>
            </div>
       `;
   }
}

元素测试文件

describe("Test Case for the AppElement Component",function() {
beforeEach(() => {
    app = new AppElement();
    document.body.appendChild(app);
    shadow = app.shadowRoot;
    app.updateComplete.then(() => {
        const tapListStub = new TapListElementStub();
        const tapListNodes = shadow.querySelectorAll('tap-list-element');
        console.log(app);
        const tapListLength = tapListNodes.length;
        const tapListNode = tapListLength === 1 ? tapListNodes[0] : null;
        tapListNode.replaceWith(tapListStub);
    });
});

it("should have the node for tap-list replaced with a stub",function(done) {
    app.updateComplete.then(() => {
        const newTap: TapListElement = shadow.querySelector('tap-list-element');
        console.log(shadow);
        assert.strictEqual('Tap List Stub',newTap.name);
        done();
    })
});

这是原始 TapListElement 的代码

@customElement('tap-list-element')
export class TapListElement extends LitElement {
    private _menu: Menu;
    private _tapList: Section;
    private _bottleList: Section;

    @property()
    name: string = 'Tap List';

    @property({type: String,attribute: true})
    display: string;

    constructor() {
        super();
        super.connectedCallback();
    }
}

这是存根

@customElement('tap-list-element')
export class TapListElementStub extends LitElement {

    @property()
    name: string = 'Tap List Stub';

    @property({type: String,attribute: true})
    display: string;

    constructor() {
        super();
        super.connectedCallback();
    }
}

对于任何缩进错别字深表歉意。

当我尝试上面的代码时,我收到错误消息,名称为“tap-list-element”的 Web 组件已被注册。我尝试删除 TapListElementStub 中的 @customElement 装饰器,但随后出现错误,指出调用了非法构造函数。 有没有人试过存根 litElement 组件? 我来自 Angular 背景。 Testbed 辅助库在那里设置模块,您可以替换任何组件,只要属性保持不变并且装饰器中组件的名称相同。

解决方法

第一个错误很可能是因为 <tap-list-element> 在两个版本中被定义了两次。这是无法避免的,因为现在自定义元素是 not un-definable (因此可以使用不同的类重新定义)。尝试删除注册调用并不能解决问题,因为组件仍会使用原始类创建。

最简单的解决方案是使用不同的标签名称(即使您引用的 Polymer 文档也是如此)。如果您确实需要相同的标签名称,那么我可以建议仅替换原始类的某些属性/方法。 OpenWC 和现代 Web 测试指南中有一些部分(12)专门用于此。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?