diff --git a/Directory.Packages.props b/Directory.Packages.props index 7a4deb521..870c8c3a1 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -8,7 +8,7 @@ - + @@ -42,7 +42,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -75,7 +75,7 @@ - + @@ -91,7 +91,7 @@ - + @@ -107,7 +107,7 @@ - + @@ -122,7 +122,7 @@ - + diff --git a/src/bunit.core/Rendering/BunitComponentActivator.cs b/src/bunit.core/Rendering/BunitComponentActivator.cs index e7afdd5c8..3d1e9c1de 100644 --- a/src/bunit.core/Rendering/BunitComponentActivator.cs +++ b/src/bunit.core/Rendering/BunitComponentActivator.cs @@ -7,10 +7,13 @@ internal class BunitComponentActivator : IComponentActivator private readonly ComponentFactoryCollection factories; private readonly IComponentActivator componentActivator; - public BunitComponentActivator(ComponentFactoryCollection factories, IComponentActivator? externalComponentActivator) + public BunitComponentActivator( + IServiceProvider serviceProvider, + ComponentFactoryCollection factories, + IComponentActivator? externalComponentActivator) { this.factories = factories ?? throw new ArgumentNullException(nameof(factories)); - this.componentActivator = externalComponentActivator ?? DefaultComponentActivator.Instance; + this.componentActivator = externalComponentActivator ?? new DefaultComponentActivator(serviceProvider); } public IComponent CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type componentType) @@ -43,12 +46,17 @@ public IComponent CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessed private sealed class DefaultComponentActivator : IComponentActivator { - public static IComponentActivator Instance { get; } = new DefaultComponentActivator(); + private readonly IServiceProvider serviceProvider; + + public DefaultComponentActivator(IServiceProvider serviceProvider) + { + this.serviceProvider = serviceProvider; + } /// public IComponent CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type componentType) - { - return (IComponent)Activator.CreateInstance(componentType)!; + { + return (IComponent)ActivatorUtilities.CreateInstance(serviceProvider, componentType); } } } diff --git a/src/bunit.core/Rendering/TestRenderer.cs b/src/bunit.core/Rendering/TestRenderer.cs index bf7449b4e..61d4deecf 100644 --- a/src/bunit.core/Rendering/TestRenderer.cs +++ b/src/bunit.core/Rendering/TestRenderer.cs @@ -79,7 +79,7 @@ public TestRenderer(IRenderedComponentActivator renderedComponentActivator, Test /// Initializes a new instance of the class. /// public TestRenderer(IRenderedComponentActivator renderedComponentActivator, TestServiceProvider services, ILoggerFactory loggerFactory) - : base(services, loggerFactory, new BunitComponentActivator(services.GetRequiredService(), null)) + : base(services, loggerFactory, new BunitComponentActivator(services, services.GetRequiredService(), null)) { logger = loggerFactory.CreateLogger(); this.activator = renderedComponentActivator; @@ -89,7 +89,7 @@ public TestRenderer(IRenderedComponentActivator renderedComponentActivator, Test /// Initializes a new instance of the class. /// public TestRenderer(IRenderedComponentActivator renderedComponentActivator, TestServiceProvider services, ILoggerFactory loggerFactory, IComponentActivator componentActivator) - : base(services, loggerFactory, new BunitComponentActivator(services.GetRequiredService(), componentActivator)) + : base(services, loggerFactory, new BunitComponentActivator(services, services.GetRequiredService(), componentActivator)) { logger = loggerFactory.CreateLogger(); this.activator = renderedComponentActivator; diff --git a/tests/bunit.testassets/SampleComponents/ConstructorInjectionComponent.cs b/tests/bunit.testassets/SampleComponents/ConstructorInjectionComponent.cs new file mode 100644 index 000000000..7b99ac4b1 --- /dev/null +++ b/tests/bunit.testassets/SampleComponents/ConstructorInjectionComponent.cs @@ -0,0 +1,13 @@ +using Microsoft.JSInterop; + +namespace Bunit.TestAssets.SampleComponents; + +public class ConstructorInjectionComponent : ComponentBase +{ + public IJSRuntime JSRuntime { get; } + + public ConstructorInjectionComponent(IJSRuntime jsRuntime) + { + JSRuntime = jsRuntime; + } +} diff --git a/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs b/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs index a4dd4a0d9..412779aad 100644 --- a/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs +++ b/tests/bunit.web.tests/Rendering/RenderedComponentTest.cs @@ -57,4 +57,14 @@ public void Test020() Should.Throw(() => target.Instance); } + #if NET9_0_OR_GREATER + + [Fact(DisplayName = "Component with constructor dependencies is resolved when rendered")] + public void Test021() + { + var cut = RenderComponent(); + + cut.Instance.JSRuntime.ShouldNotBeNull(); + } + #endif }