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

在bUnit中如何等待RenderComponent页面的OnAfterRenderAsync()完成?

解决bUnit等待OnAfterRenderAsync完成的测试方案

针对你提到的两种初始化场景(@ref子组件初始化、JavaScript调用获取浏览器设置),以下是无需添加测试专用元素的可行方案:

方法1:利用组件内部初始化标志(通用场景)

在组件的OnAfterRenderAsync中设置私有字段标记初始化完成,测试时通过反射检查该字段状态:

组件代码示例

private bool _isInitialized;

protected override async Task OnAfterRenderAsync(bool firstRender)
{
    if (firstRender)
    {
        // 执行你的初始化逻辑:子组件初始化/JS调用等
        await InitializeAsync();
        _isInitialized = true;
        StateHasChanged(); // 若后续有UI更新需触发渲染,可添加此句
    }
    await base.OnAfterRenderAsync(firstRender);
}

测试代码示例

var renderedComponent = ctx.RenderComponent<LouisHowe.web.Pages.Account.ConfirmPhone>();

// 等待初始化完成
renderedComponent.WaitForState(() => 
{
    var initField = typeof(LouisHowe.web.Pages.Account.ConfirmPhone)
        .GetField("_isInitialized", BindingFlags.NonPublic | BindingFlags.Instance);
    return (bool)initField.GetValue(renderedComponent.Instance);
});

// 此处执行测试断言逻辑

方法2:针对JS调用场景的模拟与等待

bUnit支持模拟JavaScript交互,你可以注册模拟方法后,通过断言最终状态间接等待异步操作完成:

测试代码示例

// 模拟获取浏览器设置的JS方法,返回预设值
ctx.JSInterop.Setup<string>("getBrowserSettings")
    .ReturnsAsync("zh-CN");

var renderedComponent = ctx.RenderComponent<LouisHowe.web.Pages.Account.ConfirmPhone>();

// 等待JS调用完成并触发后续渲染,通过断言最终UI状态验证
renderedComponent.WaitForAssertion(() => 
{
    Assert.Equal("zh-CN", renderedComponent.Find("#browser-lang").TextContent);
});

方法3:直接等待最终UI状态(最简洁)

如果初始化完成后UI有明确的状态变化(比如元素出现、数据加载完成),直接用WaitForAssertion包裹断言,bUnit会自动等待直到断言成立或超时:

var renderedComponent = ctx.RenderComponent<LouisHowe.web.Pages.Account.ConfirmPhone>();

// 等待初始化后的目标UI状态出现
renderedComponent.WaitForAssertion(() => 
{
    Assert.NotNull(renderedComponent.Find(".initialized-content"));
});

注意事项

  • 若组件在OnAfterRenderAsync中调用了StateHasChanged,bUnit会自动捕获后续渲染,无需额外处理
  • 可通过WaitForState/WaitForAssertion的重载参数调整超时时间,默认超时为1秒

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:50:01