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

Svelte单元测试:window对象函数未触发,toHaveBeenCalledWith断言失败

排查ModalForm.svelte单元测试中sendToast未被调用的问题

以下是几个常见的排查方向和修复方案:

1. 确认window.VOLY_UI_CONFIG.sendToast的mock时机与方式

确保在组件渲染前就完成mock,避免组件引用到未mock的原始对象:

// 在测试文件顶部或beforeEach中设置
beforeEach(() => {
  window.VOLY_UI_CONFIG = {
    sendToast: jest.fn()
  };
});

// 测试后清理(避免测试污染)
afterEach(() => {
  jest.clearAllMocks();
  delete window.VOLY_UI_CONFIG;
});

如果组件中是通过导入配置文件而非直接访问window对象来调用sendToast,需要对应mock那个配置模块。

2. 等待异步提交流程完成

表单提交通常伴随异步操作(如API请求),直接点击按钮后立即断言会因为异步未完成导致sendToast还没被调用。必须使用waitFor等待异步逻辑执行:

import { fireEvent, waitFor } from '@testing-library/svelte';

// ... 模拟输入逻辑后
await fireEvent.click(screen.getByText('Add Refund'));

// 等待sendToast被调用
await waitFor(() => {
  expect(window.VOLY_UI_CONFIG.sendToast).toHaveBeenCalled();
});

3. 检查表单验证是否通过

如果模拟的输入不符合组件的验证规则,提交逻辑根本不会触发:

  • 确认日期格式与组件要求一致(比如是否是YYYY-MM-DD格式)
  • 金额输入是否为有效数字(不能是字符串、负数等不符合规则的值)
  • 下拉选项是否选择了非默认值(组件可能要求必须选择选项才允许提交)
    可以在测试中添加断言,验证按钮是否处于可点击状态:
expect(screen.getByText('Add Refund')).not.toBeDisabled();

4. 确认提交事件被正确触发

检查是否点击了正确的按钮元素,或者按钮是否因为状态问题未响应点击:

  • 用screen.debug()打印当前DOM,确认getByText获取的是目标提交按钮
  • 如果按钮是通过Svelte的bind:disabled控制,确保所有验证条件满足后按钮才会启用

5. 排查组件销毁导致的逻辑中断

如果提交后模态框立即关闭(组件销毁),可能导致后续的sendToast调用被中断。可以在测试中临时阻止模态框关闭,或者验证sendToast的调用是在组件销毁前触发的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 03:07:11