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
相关产品推荐
相关产品推荐

