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

Blazor B-Unit单元测试:验证元素是否获得焦点

如何验证Blazor组件点击容器后输入框获得焦点的B-Unit测试?

组件代码

component.razor

<div class="main-data-data-row" @onclick="@HandleDataRowClick">
   ...
   <input class="main-data-data-row__chip-container__input" ref="InputRef"/>
</div>

component.razor.cs

public partial class DataRowTagSelectComponent<T> : DataRowComponentBase
{
   ...

   public ElementReference InputRef { get; set; }
   
   ...

   public void HandleDataRowClick()
   {
      if (!Disabled)
      {
         InputRef.FocusAsync();
      }
   }
}

现有测试代码

[Fact]
public void ClickComponent_FocusInputField()
{
   string testIdentifier = "MyTestIdentifier";
   List<string> testValue = new() { "MyTestValue1", "MyTestValue3", "MyTestValue3", };

   using var ctx = new TestContext();

   var cut = ctx.RenderComponent<DataRowTagSelectComponent<string>>(parameters => parameters
         .Add(p => p.Values, testValue)
         .Add(p => p.DataRowIdentifier, testIdentifier)
         .Add(p => p.MainDataEditMode, true)
         );

   IElement mainContainerTarget = cut.Find(".main-data-data-row");

   //模拟点击容器
   mainContainerTarget.Click();

   // 关键问题:如何获取当前激活元素?或如何检查元素是否获得焦点?
   IElement inputTarget = cut.Find(".main-data-data-row__chip-container__input");
   Assert.NotNull(inputTarget);
   
   Assert.Equal(inputTarget, ???)
}

解决方案

B-Unit提供了两种直接的方式验证元素焦点状态:

方法1:使用HasFocus()方法

IElement接口自带HasFocus()方法,可直接断言输入框是否获得焦点:

IElement inputTarget = cut.Find(".main-data-data-row__chip-container__input");
Assert.True(inputTarget.HasFocus());

方法2:验证文档激活元素

通过测试上下文获取当前文档的activeElement,对比是否为目标输入框:

IElement inputTarget = cut.Find(".main-data-data-row__chip-container__input");
var activeElement = cut.Find("html").OwnerDocument.ActiveElement;
Assert.Equal(inputTarget, activeElement);

完整测试代码

[Fact]
public void ClickComponent_FocusInputField()
{
   string testIdentifier = "MyTestIdentifier";
   List<string> testValue = new() { "MyTestValue1", "MyTestValue3", "MyTestValue3", };

   using var ctx = new TestContext();

   var cut = ctx.RenderComponent<DataRowTagSelectComponent<string>>(parameters => parameters
         .Add(p => p.Values, testValue)
         .Add(p => p.DataRowIdentifier, testIdentifier)
         .Add(p => p.MainDataEditMode, true)
         .Add(p => p.Disabled, false) // 显式确保组件未禁用
         );

   IElement mainContainerTarget = cut.Find(".main-data-data-row");
   mainContainerTarget.Click();

   IElement inputTarget = cut.Find(".main-data-data-row__chip-container__input");
   Assert.NotNull(inputTarget);
   
   // 任选一种断言方式即可
   Assert.True(inputTarget.HasFocus());
   // 或
   var activeElement = cut.Find("html").OwnerDocument.ActiveElement;
   Assert.Equal(inputTarget, activeElement);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:43:21