Course contentsShow
← C#
Lesson 1343 of 1,90812. Modern Frontend with Razor and BlazorFree lesson

Testing Components with bUnit

Write unit tests for UI logic to ensure component reliability.

In this lesson, you will learn how to verify your Blazor component's UI logic by programmatically rendering and interacting with components using the bUnit library.

Why bUnit?

When we build components, we often write logic that determines what the user sees—like showing a loading spinner during OnInitializedAsync or toggling a CSS class when a button is clicked. Manually testing these interactions in a browser is slow and error-prone. bUnit allows us to render components in a "test context," enabling us to inspect the rendered HTML and trigger events just like a real user would, all within a standard C# unit test framework like xUnit.

Rendering and Asserting

To test a component, we use the RenderComponent<T> method provided by bUnit. Once rendered, we can query the component's output to ensure it matches our expectations.

Consider a simple Counter.razor component that increments a count when a button is clicked. Here is how you would test it:

[Fact]
public void CounterIncrementsWhenButtonIsClicked()
{
    // 1. Arrange: Initialize the test context and render the component
    using var ctx = new TestContext();
    var cut = ctx.RenderComponent<Counter>();

    // 2. Act: Find the button and trigger the click event
    cut.Find("button").Click();

    // 3. Assert: Verify the count text has updated
    cut.Find("p").MarkupMatches("<p>Current count: 1</p>");
}

How It Works

  • TestContext: Acts as a container for your component, managing the lifecycle and dependencies (like the DI container).
  • RenderComponent<T>: Instantiates your component and provides a handle to it (often called the Component Under Test, or cut).
  • Find() and Click(): These methods simulate DOM interaction. bUnit finds the specific element in the rendered output and dispatches the event, which triggers the component's internal logic.
  • MarkupMatches(): This is a powerful assertion tool that compares your rendered HTML against a string, ignoring minor differences like whitespace, ensuring your UI logic is behaving exactly as intended.

By focusing on these interactions, you ensure your components remain reliable even as your application grows in complexity.

Key Takeaway: bUnit enables you to treat your Blazor components as testable objects, allowing you to programmatically verify that user interactions lead to the correct UI states.