You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jest测试deck-shuffle-btn触发shuffleDeck函数失败,求排查

卡牌组洗牌按钮测试失败排查

我开发了一个带交互式卡牌组的网站,需要验证点击id为deck-shuffle-btn的按钮时,shuffleDeck函数会执行。但当前测试显示按钮点击后卡牌组未洗牌,测试失败,怀疑问题出在测试实现上。

现有代码

事件监听逻辑(script.js)

document.addEventListener("DOMContentLoaded", () => {
    document.getElementById("deck-shuffle-btn").addEventListener("click", () => shuffleDeck(deck.shuffledDeck));
});

我已定义deck对象(包含卡牌组)、deckShuffle()函数(重排卡牌顺序)、resetDeck()函数(重置默认值后洗牌),按钮点击本应触发deckShuffle()。

测试代码(script.test.js)

describe("Test deckShuffle function when using the deck-shuffle-btn element", () => {
    beforeAll(() => {
        // 模拟包含单个按钮的HTML结构
        document.body.innerHTML =
            '<div>' + +
            '<button id="deck-shuffle-btn"></button>' +
            '</div>';
        // 重置deck对象
        resetDeck();
        // 复制初始卡组用于对比
        testElement = [...deck.shuffledDeck];
        // 触发按钮点击
        $("#deck-shuffle-btn").trigger("click");
    });
    test("洗牌后卡组顺序与初始不同", () => {
        expect(deck.shuffledDeck).not.toEqual(testElement);
    });
})

测试失败的可能原因及修复方案

  • DOMContentLoaded事件未触发:测试中直接设置DOM结构后,原事件监听绑定在DOMContentLoaded上,但该事件在测试环境启动时已触发,导致按钮的点击监听器未被绑定。
    修复:在设置完document.body.innerHTML后,手动触发DOMContentLoaded事件:

    document.dispatchEvent(new Event('DOMContentLoaded'));
    
  • HTML字符串拼接错误:测试代码中'<div>' + + '<button...'存在多余的+号,会导致DOM结构解析异常,按钮可能未正确渲染。
    修复:去掉多余的+:

    document.body.innerHTML =
        '<div>' +
        '<button id="deck-shuffle-btn"></button>' +
        '</div>';
    
  • jQuery触发点击的兼容性问题:若测试环境未引入jQuery,$("#deck-shuffle-btn").trigger("click")会失效,建议改用原生JS触发点击:

    document.getElementById("deck-shuffle-btn").click();
    
  • 函数名拼写不一致:注意到事件监听中调用的是shuffleDeck(),但描述中提到定义的是deckShuffle(),需确认二者是否为同一函数,是否存在拼写错误。

内容的提问来源于stack exchange,提问作者Ben Miles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:42:43