Skip to content

Commit efb89c3

Browse files
committed
Refactored test renderer and container component
1 parent fd27ac3 commit efb89c3

28 files changed

Lines changed: 897 additions & 745 deletions

src/bunit.core/Rendering/RazorTestRenderer.cs

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class RazorTestRenderer : Renderer
2626
/// </summary>
2727
public RazorTestRenderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory) : base(serviceProvider, loggerFactory) { }
2828

29+
2930
/// <summary>
3031
/// Renders an instance of the specified Razor-based test.
3132
/// </summary>
@@ -35,7 +36,7 @@ public async Task<IReadOnlyList<RazorTest>> GetRazorTestsFromComponent(Type comp
3536
{
3637
var componentId = await Dispatcher.InvokeAsync(() => RenderComponent(componentType)).ConfigureAwait(false);
3738
AssertNoUnhandledExceptions();
38-
return GetRazorTests(componentId);
39+
return GetRazorTests<RazorTest>(componentId);
3940
}
4041

4142
private async Task<int> RenderComponent(Type componentType)
@@ -46,15 +47,35 @@ private async Task<int> RenderComponent(Type componentType)
4647
return componentId;
4748
}
4849

49-
private IReadOnlyList<RazorTest> GetRazorTests(int fromComponentId)
50+
public async Task<IReadOnlyList<TComponent>> RenderAndGetTestComponents<TComponent>(RenderFragment renderFragment)
51+
where TComponent : FragmentBase
5052
{
51-
var result = new List<RazorTest>();
53+
var componentId = await RenderFragmentInsideWrapper(renderFragment);
54+
return GetRazorTests<TComponent>(componentId);
55+
}
56+
57+
private async Task<int> RenderFragmentInsideWrapper(RenderFragment renderFragment)
58+
{
59+
var wrapper = new WrapperComponent();
60+
var wrapperId = AssignRootComponentId(wrapper);
61+
62+
await Dispatcher.InvokeAsync(() => wrapper.Render(renderFragment)).ConfigureAwait(false);
63+
64+
AssertNoUnhandledExceptions();
65+
66+
return wrapperId;
67+
}
68+
69+
private IReadOnlyList<TComponent> GetRazorTests<TComponent>(int fromComponentId)
70+
where TComponent : FragmentBase
71+
{
72+
var result = new List<TComponent>();
5273
var ownFrames = GetCurrentRenderTreeFrames(fromComponentId);
5374
for (var i = 0; i < ownFrames.Count; i++)
5475
{
5576
ref var frame = ref ownFrames.Array[i];
5677
if (frame.FrameType == RenderTreeFrameType.Component)
57-
if (frame.Component is RazorTest component)
78+
if (frame.Component is TComponent component)
5879
result.Add(component);
5980
}
6081
return result;
@@ -74,5 +95,19 @@ private void AssertNoUnhandledExceptions()
7495
ExceptionDispatchInfo.Capture(unhandled).Throw();
7596
}
7697
}
98+
99+
private class WrapperComponent : IComponent
100+
{
101+
private RenderHandle _renderHandle;
102+
103+
public void Attach(RenderHandle renderHandle) => _renderHandle = renderHandle;
104+
105+
public Task SetParametersAsync(ParameterView parameters) => throw new InvalidOperationException($"WrapperComponent shouldn't receive any parameters");
106+
107+
public void Render(RenderFragment renderFragment)
108+
{
109+
_renderHandle.Render(renderFragment);
110+
}
111+
}
77112
}
78113
}

src/bunit.web.tests/ComponentTestFixtureTest.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ public void Test001()
3535
instance.NamedCascadingValue.ShouldBe(1337);
3636
Should.Throw<Exception>(async () => await instance.NonGenericCallback.InvokeAsync(null)).Message.ShouldBe("NonGenericCallback");
3737
Should.Throw<Exception>(async () => await instance.GenericCallback.InvokeAsync(EventArgs.Empty)).Message.ShouldBe("GenericCallback");
38-
new RenderedFragment(Services, instance.ChildContent!).Markup.ShouldBe(nameof(ChildContent));
39-
new RenderedFragment(Services, instance.OtherContent!).Markup.ShouldBe(nameof(AllTypesOfParams<string>.OtherContent));
38+
39+
new RenderedFragment(Services, Renderer.RenderFragment(instance.ChildContent!).GetAwaiter().GetResult()).Markup.ShouldBe(nameof(ChildContent));
40+
new RenderedFragment(Services, Renderer.RenderFragment(instance.OtherContent!).GetAwaiter().GetResult()).Markup.ShouldBe(nameof(AllTypesOfParams<string>.OtherContent));
4041
Should.Throw<Exception>(() => instance.ItemTemplate!("")(null)).Message.ShouldBe("ItemTemplate");
4142
}
4243

@@ -74,8 +75,8 @@ public void Test002()
7475
instance.RegularParam.ShouldBe("some value");
7576
Should.Throw<Exception>(async () => await instance.NonGenericCallback.InvokeAsync(null)).Message.ShouldBe("NonGenericCallback");
7677
Should.Throw<Exception>(async () => await instance.GenericCallback.InvokeAsync(EventArgs.Empty)).Message.ShouldBe("GenericCallback");
77-
new RenderedFragment(Services, instance.ChildContent!).Markup.ShouldBe(nameof(ChildContent));
78-
new RenderedFragment(Services, instance.OtherContent!).Markup.ShouldBe(nameof(AllTypesOfParams<string>.OtherContent));
78+
new RenderedFragment(Services, Renderer.RenderFragment(instance.ChildContent!).GetAwaiter().GetResult()).Markup.ShouldBe(nameof(ChildContent));
79+
new RenderedFragment(Services, Renderer.RenderFragment(instance.OtherContent!).GetAwaiter().GetResult()).Markup.ShouldBe(nameof(AllTypesOfParams<string>.OtherContent));
7980
Should.Throw<Exception>(() => instance.ItemTemplate!("")(null)).Message.ShouldBe("ItemTemplate");
8081
}
8182

src/bunit.web.tests/Components/TestComponentBaseTest/CorrectImplicitRazorTestContextAvailable.razor

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828

2929
void Test1()
3030
{
31-
this.
3231
GetComponentUnderTest<SimpleWithDeps>().Find("p").TextContent.ShouldBe(dep1Expected.Name);
3332
GetFragment<Simple1>().ShouldNotBeNull();
3433
}

src/bunit.web.tests/EventDispatchExtensions/GeneralEventDispatchExtensionsTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Reflection;
33
using System.Threading.Tasks;
44
using AngleSharp;

src/bunit.web.tests/Rendering/RenderedFragmentTest.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public void Test009()
8787
cut.Instance.Counter.ShouldBe(1);
8888
}
8989

90-
[Fact(DisplayName = "GetComponent returns first component of requested type using a depth first search")]
90+
[Fact(DisplayName = "FindComponent returns first component of requested type using a depth first search")]
9191
public void Test100()
9292
{
9393
var wrapper = RenderComponent<TwoComponentWrapper>(
@@ -96,12 +96,13 @@ public void Test100()
9696
)),
9797
RenderFragment<Simple1>(nameof(TwoComponentWrapper.Second), (nameof(Simple1.Header), "Second"))
9898
);
99+
99100
var cut = wrapper.FindComponent<Simple1>();
100101

101102
cut.Instance.Header.ShouldBe("First");
102103
}
103104

104-
[Fact(DisplayName = "GetComponent returns CUT if it is the first component of the requested type")]
105+
[Fact(DisplayName = "FindComponent returns CUT if it is the first component of the requested type", Skip = "doesnt make much sense tbh")]
105106
public void Test101()
106107
{
107108
var cut = RenderComponent<Simple1>();

0 commit comments

Comments
 (0)