Skip to content

Commit 76fd92f

Browse files
authored
fix: New up renderer for markup matches (#1160)
* fix: New up renderer for markup matches * revert: Changes for editorconfig * chore: Suppress xUnit1026
1 parent ffd6fa7 commit 76fd92f

3 files changed

Lines changed: 75 additions & 2 deletions

File tree

src/bunit.web/Asserting/MarkupMatchesAssertExtensions.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Bunit.Diffing;
44
using Bunit.Extensions;
55
using Bunit.Rendering;
6+
using Microsoft.Extensions.Logging;
67

78
namespace Bunit;
89

@@ -299,8 +300,13 @@ public static void MarkupMatches(this IRenderedFragment actual, RenderFragment e
299300
if (expected is null)
300301
throw new ArgumentNullException(nameof(expected));
301302

302-
var testContext = actual.Services.GetRequiredService<TestContextBase>();
303-
var renderedFragment = (IRenderedFragment)testContext.RenderInsideRenderTree(expected);
303+
// TODO: This will be obsolete with: https://github.com/bUnit-dev/bUnit/issues/1018
304+
// As the renderer would be transient we don't have to new up an instance
305+
using var renderer = new TestRenderer(
306+
actual.Services.GetRequiredService<IRenderedComponentActivator>(),
307+
actual.Services.GetRequiredService<TestServiceProvider>(),
308+
actual.Services.GetRequiredService<ILoggerFactory>());
309+
var renderedFragment = (IRenderedFragment)renderer.RenderFragment(expected);
304310
MarkupMatches(actual, renderedFragment, userMessage);
305311
}
306312

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
@if (Task != null)
2+
{
3+
@if (Task.IsCompleted)
4+
{
5+
<span>done</span>
6+
}
7+
else
8+
{
9+
<span>waiting</span>
10+
}
11+
}
12+
@code {
13+
[Parameter] public Task? Task { get; set; }
14+
15+
private Task? registeredTask;
16+
private Task? delegatedTask;
17+
18+
protected override void OnParametersSet()
19+
{
20+
var task = Task;
21+
if (task != registeredTask)
22+
{
23+
registeredTask = task;
24+
delegatedTask = task == null ? null : DelegateTo(task);
25+
RenderWhenDone();
26+
}
27+
28+
base.OnParametersSet();
29+
}
30+
31+
private async void RenderWhenDone()
32+
{
33+
var task = delegatedTask;
34+
if (task != null)
35+
{
36+
_ = await Task.WhenAny(task).ConfigureAwait(false);
37+
38+
if (task == delegatedTask)
39+
{
40+
_ = InvokeAsync(StateHasChanged);
41+
}
42+
}
43+
}
44+
45+
private static async Task<object?> DelegateTo(Task task)
46+
{
47+
await task;//.ConfigureAwait(false);
48+
return null;
49+
}
50+
}

tests/bunit.web.tests/Asserting/MarkupMatchesTests.razor

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
@inherits TestContext
33

44
@code {
5+
56
[Fact]
67
public void MarkupMatchesShouldNotBeBlockedByRenderer()
78
{
@@ -15,4 +16,20 @@
1516

1617
cut.WaitForAssertion(() => cut.MarkupMatches(@<span>done</span>));
1718
}
19+
20+
[SuppressMessage("Usage", "xUnit1026:Theory method does not use parameter")]
21+
[Theory]
22+
[Repeat(2)]
23+
public void MarkupMatchesShouldNotBeBlockedByRendererComplex(int repeatCount)
24+
{
25+
var tcs = new TaskCompletionSource<object?>();
26+
27+
var cut = Render(@<InvokeAsyncInsideContinueWith Task="@tcs.Task"/> );
28+
29+
cut.MarkupMatches(@<span>waiting</span>);
30+
31+
tcs.SetResult(true);
32+
33+
cut.WaitForAssertion(() => cut.MarkupMatches(@<span>done</span>));
34+
}
1835
}

0 commit comments

Comments
 (0)