From fc4e457bfa161ac6c3920ec056c98552bb53227d Mon Sep 17 00:00:00 2001
From: Tom Longhurst <30480171+thomhurst@users.noreply.github.com>
Date: Sat, 29 Nov 2025 19:50:23 +0000
Subject: [PATCH 1/2] fix: ensure IClassConstructor and ITestEndEventReceiver
share the same instance for state management
---
TUnit.Core/Helpers/ClassConstructorHelper.cs | 6 +--
TUnit.TestProject/Bugs/3939/Tests.cs | 53 ++++++++++++++++++++
2 files changed, 56 insertions(+), 3 deletions(-)
create mode 100644 TUnit.TestProject/Bugs/3939/Tests.cs
diff --git a/TUnit.Core/Helpers/ClassConstructorHelper.cs b/TUnit.Core/Helpers/ClassConstructorHelper.cs
index 136a6132b1..8430cfb63b 100644
--- a/TUnit.Core/Helpers/ClassConstructorHelper.cs
+++ b/TUnit.Core/Helpers/ClassConstructorHelper.cs
@@ -50,9 +50,9 @@ public static class ClassConstructorHelper
return null;
}
- // Use the ClassConstructor to create the instance
- var classConstructorType = classConstructorAttribute.ClassConstructorType;
- var classConstructor = (IClassConstructor)Activator.CreateInstance(classConstructorType)!;
+ // Reuse existing ClassConstructor if already set, otherwise create new instance
+ var classConstructor = testBuilderContext.ClassConstructor
+ ?? (IClassConstructor)Activator.CreateInstance(classConstructorAttribute.ClassConstructorType)!;
testBuilderContext.ClassConstructor = classConstructor;
diff --git a/TUnit.TestProject/Bugs/3939/Tests.cs b/TUnit.TestProject/Bugs/3939/Tests.cs
new file mode 100644
index 0000000000..215a5be18c
--- /dev/null
+++ b/TUnit.TestProject/Bugs/3939/Tests.cs
@@ -0,0 +1,53 @@
+using System.Diagnostics.CodeAnalysis;
+using TUnit.Core.Interfaces;
+using TUnit.TestProject.Attributes;
+
+namespace TUnit.TestProject.Bugs._3939;
+
+///
+/// Regression test for issue #3939: IClassConstructor and ITestEndEventReceiver
+/// should use the same instance so that state can be shared (e.g., DI scope disposal).
+///
+public sealed class ScopedClassConstructor : IClassConstructor, ITestEndEventReceiver
+{
+ private object? _scope;
+
+ public Task