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

Bunit测试Blazor WebAssembly时如何读写blazorCulture修改组件文化语言

Bunit测试场景下Blazor文化设置逻辑的实现方案

你遇到的问题本质是环境差异:Blazor WASM正式运行时会在客户端JS上下文默认注册blazorCulture.get、blazorCulture.set两个互操作方法,用于读写localStorage里存储的文化配置;但Bunit测试宿主不会自动加载这部分JS逻辑,也没有内置这两个方法的模拟实现,直接调用IJSRuntime会触发"未注册JS调用"的错误,自然拿不到返回值、也无法完成文化设置。

按以下步骤配置即可正常测试:

  • 测试初始化阶段,用Bunit内置的JSInterop模拟两个文化相关的JS方法,不需要引入第三方Mock库
using var testContext = new TestContext();
// 模拟初始存储的文化值,测默认逻辑时可以传空字符串/null
testContext.JSInterop.Setup<string>("blazorCulture.get")
   .SetResult(""); 
// 注册set方法的模拟,匹配任意入参
var setCultureHandler = testContext.JSInterop.SetupVoid("blazorCulture.set", _ => true);
  • 渲染组件后如果要修改文化配置,分两种处理方式:
    • 测业务逻辑正确性:触发组件上的文化切换交互(比如语言下拉框选择、按钮点击),之后通过setCultureHandler.VerifyInvoke("blazorCulture.set", 调用次数)校验set方法是否被正确触发,同时断言CultureInfo.CurrentCulture、CultureInfo.CurrentUICulture的Name属性是否符合预期值
    • 直接修改测试环境文化:不需要走JS互操作的场景,可以直接给当前线程赋值文化信息,再调用组件的Render()方法触发重渲染即可
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
    cut.Render();
    
  • 完整测试用例参考
[Fact]
public async Task Component_Should_Use_Default_deDE_Culture_When_No_Stored_Value()
{
    using var ctx = new TestContext();
    // 模拟无存储文化值的场景
    ctx.JSInterop.Setup<string>("blazorCulture.get").SetResult(string.Empty);
    var setInvoke = ctx.JSInterop.SetupVoid("blazorCulture.set", "de-DE");

    // 渲染待测组件,替换为你自己的组件类
    var component = ctx.RenderComponent<MainApp>();

    // 校验逻辑结果
    Assert.Equal("de-DE", CultureInfo.CurrentCulture.Name);
    setInvoke.VerifyInvoke("blazorCulture.set", 1);
}

注意:Bunit的JSInterop默认是严格模式,所有组件内发起的JS调用都必须提前注册模拟逻辑,否则测试会直接抛出异常,不需要在测试环境尝试启动完整的Blazor WASM JS运行时,Mock对应调用是最稳定高效的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:39:34