From 2a77ebb619da11160879c727d21834507319edef Mon Sep 17 00:00:00 2001 From: Steven Giesel Date: Fri, 27 Jun 2025 12:26:20 +0200 Subject: [PATCH] fix: Check if components got disposed --- src/bunit/Rendering/BunitRenderer.cs | 8 ++++++ .../SampleComponents/FormWithValidation.razor | 26 +++++++++++++++++++ .../Rendering/RenderedComponentTest.cs | 11 ++++++++ 3 files changed, 45 insertions(+) create mode 100644 tests/bunit.testassets/SampleComponents/FormWithValidation.razor diff --git a/src/bunit/Rendering/BunitRenderer.cs b/src/bunit/Rendering/BunitRenderer.cs index 46c0ed095..646c008a9 100644 --- a/src/bunit/Rendering/BunitRenderer.cs +++ b/src/bunit/Rendering/BunitRenderer.cs @@ -447,15 +447,23 @@ protected override void ProcessPendingRender() /// protected override Task UpdateDisplayAsync(in RenderBatch renderBatch) { + var disposedComponentIds = new HashSet(); for (var i = 0; i < renderBatch.DisposedComponentIDs.Count; i++) { var id = renderBatch.DisposedComponentIDs.Array[i]; + disposedComponentIds.Add(id); returnedRenderedComponentIds.Remove(id); } for (var i = 0; i < renderBatch.UpdatedComponents.Count; i++) { var diff = renderBatch.UpdatedComponents.Array[i]; + + if (disposedComponentIds.Contains(diff.ComponentId)) + { + continue; + } + var componentState = GetComponentState(diff.ComponentId); var renderedComponent = (IRenderedComponent)componentState; diff --git a/tests/bunit.testassets/SampleComponents/FormWithValidation.razor b/tests/bunit.testassets/SampleComponents/FormWithValidation.razor new file mode 100644 index 000000000..7aeac0e07 --- /dev/null +++ b/tests/bunit.testassets/SampleComponents/FormWithValidation.razor @@ -0,0 +1,26 @@ + + + + + + + +@code { + + [Parameter] + public bool Invoked { get; set; } + + private Model model = new(); + + private void SetInvoked() + { + Invoked = true; + model = new Model(); + } + + public sealed class Model + { + public string? Title { get; set; } + } + +} diff --git a/tests/bunit.tests/Rendering/RenderedComponentTest.cs b/tests/bunit.tests/Rendering/RenderedComponentTest.cs index 798b517ea..2c1866495 100644 --- a/tests/bunit.tests/Rendering/RenderedComponentTest.cs +++ b/tests/bunit.tests/Rendering/RenderedComponentTest.cs @@ -244,6 +244,17 @@ public void Test024() text.ShouldNotBeNull(); } + + [Fact(DisplayName = "Form submission with DataAnnotationsValidator and model recreation works correctly")] + public void Test025() + { + var cut = Render(); + cut.Find("#title").Change("title"); + + cut.Find("form").Submit(); + + cut.Instance.Invoked.ShouldBeTrue(); + } private class BaseComponent : ComponentBase {