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

如何测试Blazor中InputCheckbox触发CallApi方法的调用?

问题描述

我在Blazor页面中定义了如下InputCheckbox组件:

<InputCheckbox id="my-cb" ValueChanged="@CallApi" ValueExpression="@(() => MyFlag)">

@code {
    public bool MyFlag { get; set; }

    async Task CallApi()
    {
        // 调用API逻辑
    }
}

交互状态下点击复选框可正常触发CallApi方法,但在单元测试中,我已Mock了API,尝试触发复选框的Change事件或直接修改MyFlag值时,CallApi都未执行:

// 方式1:触发Change事件无效
var cbx = cut.Find("#my-cb");
cbx.Change(); // 未调用CallApi

// 方式2:直接修改属性无效
cut.Instance.MyFlag = true; // 未调用CallApi
解决方案

方法1:正确模拟用户交互(推荐)

Blazor的InputCheckbox组件会在检测到输入状态变更后,才会触发ValueChanged回调。直接调用Change()方法未传递状态变更,需要先设置复选框的选中状态,再触发事件并等待组件更新:

var cbx = cut.Find("#my-cb");
// 设置复选框为选中状态
cbx.SetAttribute("checked", "true");
// 触发Change事件
cbx.Change();
// 等待组件完成状态更新和回调执行
await cut.WaitForState(() => cut.Instance.MyFlag == true);

// 此时验证Mock API是否被调用即可

方法2:直接调用组件的ValueChanged回调

如果不需要模拟完整的用户交互,可直接获取InputCheckbox组件实例,调用其ValueChanged委托:

var checkboxComponent = cut.FindComponent<InputCheckbox>();
// 传入变更后的值,触发回调
await checkboxComponent.Instance.ValueChanged.InvokeAsync(true);

// 验证Mock API的调用情况

方法3:使用bUnit的TriggerChange重载传递值

bUnit提供了带参数的TriggerChange方法,可直接传递目标值触发组件的逻辑:

var cbx = cut.Find("#my-cb");
// 传递选中状态的值触发Change
cbx.TriggerChange(true);

// 等待组件处理完成
await cut.WaitForAssertion(() => 
{
    // 这里写验证Mock API被调用的断言
});
关键原因说明
  • 直接调用Change()未传递值时,组件无法感知状态变更,因此不会触发ValueChanged
  • 直接修改MyFlag属性属于外部变更,Blazor的表单组件不会主动监听属性的直接修改来触发ValueChanged,只有组件内部处理用户输入或主动调用回调时才会触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:47:20