Skip to content

Commit 0fa594c

Browse files
committed
fix: log when render cycle happens after dispose is called
1 parent 4db5a6e commit 0fa594c

2 files changed

Lines changed: 71 additions & 8 deletions

File tree

src/bunit.core/Rendering/TestRenderer.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,10 @@ public void DisposeComponents()
168168
protected override void ProcessPendingRender()
169169
{
170170
if (disposed)
171+
{
172+
logger.LogRenderCycleActiveAfterDispose();
171173
return;
174+
}
172175

173176
// Blocks updates to the renderers internal render tree
174177
// while the render tree is being read elsewhere.
@@ -184,7 +187,10 @@ protected override void ProcessPendingRender()
184187
protected override Task UpdateDisplayAsync(in RenderBatch renderBatch)
185188
{
186189
if (disposed)
190+
{
191+
logger.LogRenderCycleActiveAfterDispose();
187192
return Task.CompletedTask;
193+
}
188194

189195
if (usersSyncContext is not null && usersSyncContext != SynchronizationContext.Current)
190196
{
@@ -220,6 +226,12 @@ private void UpdateDisplay(in RenderBatch renderBatch)
220226
RenderCount++;
221227
var renderEvent = new RenderEvent(renderBatch, new RenderTreeFrameDictionary());
222228

229+
if (disposed)
230+
{
231+
logger.LogRenderCycleActiveAfterDispose();
232+
return;
233+
}
234+
223235
// removes disposed components
224236
for (var i = 0; i < renderBatch.DisposedComponentIDs.Count; i++)
225237
{

src/bunit.core/Rendering/TestRendererLoggerExtensions.cs

Lines changed: 59 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,27 +28,78 @@ internal static class TestRendererLoggerExtensions
2828
private static readonly Action<ILogger, string, string, Exception> UnhandledException
2929
= LoggerMessage.Define<string, string>(LogLevel.Error, new EventId(30, "LogUnhandledException"), "An unhandled exception happened during rendering: {Message}" + Environment.NewLine + "{StackTrace}");
3030

31+
private static readonly Action<ILogger, Exception?> RenderCycleActiveAfterDispose
32+
= LoggerMessage.Define(LogLevel.Warning, new EventId(31, "LogRenderCycleActiveAfterDispose"), "A component attempted to update the render tree after the renderer was disposed.");
33+
3134
internal static void LogProcessingPendingRenders(this ILogger<TestRenderer> logger)
32-
=> ProcessingPendingRenders(logger, null);
35+
{
36+
if (logger.IsEnabled(LogLevel.Debug))
37+
{
38+
ProcessingPendingRenders(logger, null);
39+
}
40+
}
3341

3442
internal static void LogNewRenderBatchReceived(this ILogger<TestRenderer> logger)
35-
=> NewRenderBatchReceived(logger, null);
43+
{
44+
if (logger.IsEnabled(LogLevel.Debug))
45+
{
46+
NewRenderBatchReceived(logger, null);
47+
}
48+
}
3649

3750
internal static void LogComponentDisposed(this ILogger<TestRenderer> logger, int componentId)
38-
=> ComponentDisposed(logger, componentId, null);
51+
{
52+
if (logger.IsEnabled(LogLevel.Debug))
53+
{
54+
ComponentDisposed(logger, componentId, null);
55+
}
56+
}
3957

4058
internal static void LogComponentRendered(this ILogger<TestRenderer> logger, int componentId)
41-
=> ComponentRendered(logger, componentId, null);
59+
{
60+
if (logger.IsEnabled(LogLevel.Debug))
61+
{
62+
ComponentRendered(logger, componentId, null);
63+
}
64+
}
4265

4366
internal static void LogChangedComponentsMarkupUpdated(this ILogger<TestRenderer> logger)
44-
=> ChangedComponentsMarkupUpdated(logger, null);
67+
{
68+
if (logger.IsEnabled(LogLevel.Debug))
69+
{
70+
ChangedComponentsMarkupUpdated(logger, null);
71+
}
72+
}
4573

4674
internal static void LogAsyncInitialRender(this ILogger<TestRenderer> logger)
47-
=> AsyncInitialRender(logger, null);
75+
{
76+
if (logger.IsEnabled(LogLevel.Debug))
77+
{
78+
AsyncInitialRender(logger, null);
79+
}
80+
}
4881

4982
internal static void LogInitialRenderCompleted(this ILogger<TestRenderer> logger, int componentId)
50-
=> InitialRenderCompleted(logger, componentId, null);
83+
{
84+
if (logger.IsEnabled(LogLevel.Debug))
85+
{
86+
InitialRenderCompleted(logger, componentId, null);
87+
}
88+
}
5189

5290
internal static void LogUnhandledException(this ILogger<TestRenderer> logger, Exception exception)
53-
=> UnhandledException(logger, exception.Message, exception.StackTrace ?? string.Empty, exception);
91+
{
92+
if (logger.IsEnabled(LogLevel.Error))
93+
{
94+
UnhandledException(logger, exception.Message, exception.StackTrace ?? string.Empty, exception);
95+
}
96+
}
97+
98+
internal static void LogRenderCycleActiveAfterDispose(this ILogger<TestRenderer> logger)
99+
{
100+
if (logger.IsEnabled(LogLevel.Warning))
101+
{
102+
RenderCycleActiveAfterDispose(logger, null);
103+
}
104+
}
54105
}

0 commit comments

Comments
 (0)