@@ -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}
0 commit comments