Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions TUnit.Core/TestBuilderContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ public static TestBuilderContext? Current
set => _stateBag = value;
}

internal ConcurrentDictionary<string, object?>? RawStateBag => _stateBag;

public TestContextEvents Events
{
get => _events ??= new TestContextEvents();
Expand Down
21 changes: 17 additions & 4 deletions TUnit.Engine/Building/TestBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -283,10 +283,15 @@ await _objectLifecycleService.RegisterObjectAsync(
{
TestMetadata = metadata.MethodMetadata,
DataSourceAttribute = methodDataSource,
InitializedAttributes = testBuilderContext.InitializedAttributes, // Preserve attributes from parent context
ClassConstructor = testBuilderContext.ClassConstructor // Preserve ClassConstructor for instance creation
InitializedAttributes = testBuilderContext.InitializedAttributes,
ClassConstructor = testBuilderContext.ClassConstructor
};

if (testBuilderContext.RawStateBag is { IsEmpty: false } parentStateBag)
{
contextAccessor.Current.StateBag = new ConcurrentDictionary<string, object?>(parentStateBag);
}

var (classDataUnwrapped, classRowMetadata) = DataUnwrapper.UnwrapWithMetadata(await classDataFactory() ?? []);
classData = classDataUnwrapped;
var (methodData, methodRowMetadata) = DataUnwrapper.UnwrapWithTypesAndMetadata(await methodDataFactory() ?? [], metadata.MethodMetadata.Parameters);
Expand Down Expand Up @@ -476,7 +481,6 @@ await _objectLifecycleService.RegisterObjectAsync(
ResolvedMethodGenericArguments = Type.EmptyTypes
};

// StateBag and Events are lazy-initialized
var testSpecificContext = new TestBuilderContext
{
TestMetadata = metadata.MethodMetadata,
Expand All @@ -485,6 +489,11 @@ await _objectLifecycleService.RegisterObjectAsync(
InitializedAttributes = attributes
};

if (testBuilderContext.RawStateBag is { IsEmpty: false } skipParentStateBag)
{
testSpecificContext.StateBag = new ConcurrentDictionary<string, object?>(skipParentStateBag);
}

var test = await BuildTestAsync(metadata, testData, testSpecificContext, cancellationToken: cancellationToken);
test.Context.SkipReason = skipReason;
tests.Add(test);
Expand Down Expand Up @@ -535,7 +544,6 @@ await _objectLifecycleService.RegisterObjectAsync(
ResolvedMethodGenericArguments = Type.EmptyTypes
};

// StateBag and Events are lazy-initialized
var testSpecificContext = new TestBuilderContext
{
TestMetadata = metadata.MethodMetadata,
Expand All @@ -544,6 +552,11 @@ await _objectLifecycleService.RegisterObjectAsync(
InitializedAttributes = attributes
};

if (testBuilderContext.RawStateBag is { IsEmpty: false } skipClassParentStateBag)
{
testSpecificContext.StateBag = new ConcurrentDictionary<string, object?>(skipClassParentStateBag);
}

var test = await BuildTestAsync(metadata, testData, testSpecificContext, cancellationToken: cancellationToken);
test.Context.SkipReason = skipReason;
tests.Add(test);
Expand Down
28 changes: 28 additions & 0 deletions TUnit.TestProject/Bugs/Issue5267/Tests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
using TUnit.TestProject.Attributes;

namespace TUnit.TestProject.Bugs.Issue5267;

[EngineTest(ExpectedResult.Pass)]
public class StateBagDataSourcePropagationTests
{
public static IEnumerable<string> TestData()
{
var builderContext = TestBuilderContext.Current;
if (builderContext != null)
{
builderContext.StateBag["DataGeneratedAt"] = "2025-01-01";
builderContext.StateBag["GeneratorVersion"] = "1.0";
}

yield return "test1";
yield return "test2";
}

[Test]
[MethodDataSource(nameof(TestData))]
public async Task StateBag_Data_From_DataSource_Should_Be_Available_In_TestContext(string value)
{
await Assert.That(TestContext.Current!.StateBag["DataGeneratedAt"]).IsEqualTo("2025-01-01");
await Assert.That(TestContext.Current!.StateBag["GeneratorVersion"]).IsEqualTo("1.0");
}
}
Loading