Skip to content

when SetParametersAsync is used (only async) - BuildRenderTree is not invoked #1695

@ghost

Description

Several issues are related to SetParametersAsync, but I am unsure whether they are the same as mine, so I tried creating a new incident.

Describe the bug
When a component has SetParametersAsync then BuildRenderTree is not invoked.

Example:
Testing this component:

using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Rendering;

namespace ClassLibrary1;

public class ComponentWithAsyncSetParameters : ComponentBase
{
	public override async Task SetParametersAsync(ParameterView parameters)
	{
		await Task.Delay(1000);
	}

	protected override void BuildRenderTree(RenderTreeBuilder builder)
	{
		builder.OpenElement(1, "h1");
		builder.AddContent(2, "HEADER TEXT");
		builder.CloseElement();
	}
}

public class ComponentWithoutAsyncSetParameters : ComponentBase
{
	public override Task SetParametersAsync(ParameterView parameters)
	{
		return Task.CompletedTask;
	}

	protected override void BuildRenderTree(RenderTreeBuilder builder)
	{
		builder.OpenElement(1, "h1");
		builder.AddContent(2, "HEADER TEXT");
		builder.CloseElement();
	}
}

public class ComponentWithoutSetParameters : ComponentBase
{
	protected override void BuildRenderTree(RenderTreeBuilder builder)
	{
		builder.OpenElement(1, "h1");
		builder.AddContent(2, "HEADER TEXT");
		builder.CloseElement();
	}
}

With this test:

using Bunit;
using ClassLibrary1;

namespace TestProject1;

public sealed class UnitTest1 : TestContext
{
	[Fact]
	public void TestComponentWithAsyncSetParameters()
	{
		const string expected = "<h1>HEADER TEXT</h1>";

		var component = RenderComponent<ComponentWithAsyncSetParameters>();
		component.MarkupMatches(expected);
	}
	
	[Fact]
	public void TestComponentWithoutAsyncSetParameters()
	{
		const string expected = "<h1>HEADER TEXT</h1>";

		var component = RenderComponent<ComponentWithoutAsyncSetParameters>();
		component.MarkupMatches(expected);
	}
	
	[Fact]
	public void TestComponentWithoutSetParameters()
	{
		const string expected = "<h1>HEADER TEXT</h1>";

		var component = RenderComponent<ComponentWithoutSetParameters>();
		component.MarkupMatches(expected);
	}
}

Results in this output:
Image
Image

Bunit.HtmlEqualException: HTML comparison failed.

Bunit.HtmlEqualException
HTML comparison failed. 

The following errors were found:
  1: The element at h1(0) is missing.

Actual HTML: 

Expected HTML: 
<h1>HEADER TEXT</h1>

   at Bunit.MarkupMatchesAssertExtensions.MarkupMatches(INodeList actual, INodeList expected, String userMessage) in /_/src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs:line 238
   at Bunit.MarkupMatchesAssertExtensions.MarkupMatches(IRenderedFragment actual, String expected, String userMessage) in /_/src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs:line 114
   at TestProject1.UnitTest1.TestComponentWithoutAsyncSetParameters() in C:\Users\Mihails Kuzmins\source\repos\ClassLibrary1\TestProject1\UnitTest1.cs:line 23
   at InvokeStub_UnitTest1.TestComponentWithoutAsyncSetParameters(Object, Object, IntPtr*)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)

Expected behavior:
BuildRenderTree is invoked, and the valid HTML is rendered

Version info:

  • bUnit version: 1.38.5
  • .NET Runtime and Blazor version: net9.0; 9.0.3
  • OS type and version: Windows 10.0.26100.3624

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions