Skip to content

Commit aebd07a

Browse files
ilonatommyjaviercn
andauthored
Improve renderer unit test (#62016)
* Improve tests, use constant string in feature attribute. * Update src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.cs Co-authored-by: Javier Calvarro Nelson <jacalvar@microsoft.com> --------- Co-authored-by: Javier Calvarro Nelson <jacalvar@microsoft.com>
1 parent 7ba32e7 commit aebd07a

File tree

4 files changed

+45
-19
lines changed

4 files changed

+45
-19
lines changed

src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,8 @@ protected override void AddPendingTask(ComponentState? componentState, Task task
183183
base.AddPendingTask(componentState, task);
184184
}
185185

186-
private void SignalRendererToFinishRendering()
186+
// For testing purposes only
187+
internal void SignalRendererToFinishRendering()
187188
{
188189
// sets a deferred stop on the renderer, which will have an effect after the current batch is completed
189190
_rendererIsStopped = true;

src/Components/Endpoints/test/EndpointHtmlRendererTest.cs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using Microsoft.AspNetCore.Components.Infrastructure;
1212
using Microsoft.AspNetCore.Components.Reflection;
1313
using Microsoft.AspNetCore.Components.Rendering;
14+
using Microsoft.AspNetCore.Components.RenderTree;
1415
using Microsoft.AspNetCore.Components.Test.Helpers;
1516
using Microsoft.AspNetCore.Components.Web;
1617
using Microsoft.AspNetCore.DataProtection;
@@ -47,18 +48,23 @@ public EndpointHtmlRendererTest()
4748
}
4849

4950
[Fact]
50-
public async Task DoesNotRenderChildAfterRendererStopped()
51+
public async Task DoesNotRenderAfterRendererStopped()
5152
{
52-
renderer.SignalRendererToFinishRendering();
53-
5453
var httpContext = GetHttpContext();
5554
var writer = new StringWriter();
5655

57-
var result = await renderer.PrerenderComponentAsync(httpContext, typeof(SimpleComponent), null, ParameterView.Empty);
58-
await renderer.Dispatcher.InvokeAsync(() => result.WriteTo(writer, HtmlEncoder.Default));
59-
var content = writer.ToString();
56+
var component = new StoppingRendererComponent();
57+
var id = renderer.AssignRootComponentId(component);
58+
var initialRenderOperation = renderer.Dispatcher.InvokeAsync(
59+
() => renderer.RenderRootComponentAsync(id, ParameterView.Empty));
6060

61-
Assert.DoesNotContain("Hello from SimpleComponent", content);
61+
renderer.SignalRendererToFinishRendering();
62+
component.TaskCompletionSource.SetResult(false);
63+
await initialRenderOperation;
64+
int initialRenderCount = renderer.RenderCount;
65+
66+
await renderer.Dispatcher.InvokeAsync(() => renderer.RenderRootComponentAsync(id, ParameterView.Empty));
67+
Assert.Equal(initialRenderCount, renderer.RenderCount);
6268
}
6369

6470
[Fact]
@@ -1772,18 +1778,10 @@ private TestEndpointHtmlRenderer GetEndpointHtmlRenderer(IServiceProvider servic
17721778
private class TestEndpointHtmlRenderer : EndpointHtmlRenderer
17731779
{
17741780
private bool _rendererIsStopped = false;
1775-
public TestEndpointHtmlRenderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory) : base(serviceProvider, loggerFactory)
1776-
{
1777-
}
1781+
private int _renderCount;
17781782

1779-
internal int TestAssignRootComponentId(IComponent component)
1783+
public TestEndpointHtmlRenderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory) : base(serviceProvider, loggerFactory)
17801784
{
1781-
return base.AssignRootComponentId(component);
1782-
}
1783-
public void SignalRendererToFinishRendering()
1784-
{
1785-
// sets a deferred stop on the renderer, which will have an effect after the current batch is completed
1786-
_rendererIsStopped = true;
17871785
}
17881786

17891787
protected override void ProcessPendingRender()
@@ -1793,6 +1791,16 @@ protected override void ProcessPendingRender()
17931791
return;
17941792
}
17951793
base.ProcessPendingRender();
1794+
1795+
_renderCount++;
1796+
}
1797+
1798+
public int RenderCount => _renderCount;
1799+
1800+
public new void SignalRendererToFinishRendering()
1801+
{
1802+
_rendererIsStopped = true;
1803+
base.SignalRendererToFinishRendering();
17961804
}
17971805
}
17981806

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<h1>Hello from StoppingRendererComponent</h1>
2+
<p>State is @_state</p>
3+
4+
@code {
5+
private bool _state = true;
6+
7+
// expose a TCS so the test can control when OnInitializedAsync completes
8+
public TaskCompletionSource<bool> TaskCompletionSource = new TaskCompletionSource<bool>();
9+
10+
protected override async Task OnInitializedAsync()
11+
{
12+
// wait until the test signals
13+
var result = await TaskCompletionSource.Task;
14+
_state = result;
15+
StateHasChanged();
16+
}
17+
}

src/Components/Server/src/Circuits/RemoteNavigationManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ internal sealed partial class RemoteNavigationManager : NavigationManager, IHost
1919
private bool? _navigationLockStateBeforeJsRuntimeAttached;
2020
private const string _enableThrowNavigationException = "Microsoft.AspNetCore.Components.Endpoints.NavigationManager.EnableThrowNavigationException";
2121

22-
[FeatureSwitchDefinition("Microsoft.AspNetCore.Components.Endpoints.NavigationManager.EnableThrowNavigationException")]
22+
[FeatureSwitchDefinition(_enableThrowNavigationException)]
2323
private static bool _throwNavigationException =>
2424
AppContext.TryGetSwitch(_enableThrowNavigationException, out var switchValue) && switchValue;
2525
private Func<string, Task>? _onNavigateTo;

0 commit comments

Comments
 (0)