Skip to content

[Bug]: DependencyInjectionDataSourceAttribute broken with InheritsTests #6162

Description

@Nice3point

Description

I want to use parametric constructor to configure tests for different cases instead of duplicating the code.
But

public abstract class ExportMetadataTests(
    IMetadataExportService metadataExportService,
    IFileWorkspaceService workspaceService,
    string? extension = null)
    : RevitModelSampleTest(workspaceService, extension)
{
    [Test]
    [MethodDataSource(nameof(DocumentPaths))]
    public async Task Extract_ValidFamily_ReturnsMetadata(string path)
    {
        // Arrange
        var document = Documents[path];

        // Act
        var metadata = metadataExportService.Export(document);

        // Assert
        using (Assert.Multiple())
        {
            ...
        }
    }

    [Test]
    [MethodDataSource(nameof(DocumentPaths))]
    public async Task Extract_FamilyDocument_ReturnsCurrentRevitVersion(string path)
    {
        // Arrange
        var document = Documents[path];

        // Act
        var metadata = metadataExportService.Export(document);

        // Assert
        ...
    }
}

[InheritsTests]
[WorkerDependencyInjectionDataSource]
public sealed class ExportFamilyMetadataTests(IMetadataExportService metadataExportService, IFileWorkspaceService workspaceService)
    : ExportMetadataTests(metadataExportService, workspaceService, extension: ".rfa");

[InheritsTests]
[WorkerDependencyInjectionDataSource]
public sealed class ExportProjectMetadataTests(IMetadataExportService metadataExportService, IFileWorkspaceService workspaceService)
    : ExportMetadataTests(metadataExportService, workspaceService, extension: ".rvt");

InheritsTests tries to call Activator instead of using DI. without InheritsTests, tests with DependencyInjectionDataSource work fine

Expected Behavior

InheritsTests should use DependencyInjectionDataSourceAttribute instead of create a parameterless type

Actual Behavior

InheritsTests ignores DependencyInjectionDataSourceAttribute and uses Activator.CreateInstance

Steps to Reproduce

  • Create a base class
  • Inherit from it
  • Add InheritsTests and DependencyInjectionDataSourceAttribute attributes

TUnit Version

1.49.0

.NET Version

.NET 10

Operating System

Linux

IDE / Test Runner

JetBrains Rider

Error Output / Stack Trace

[Test Failure] Cannot dynamically create an instance of type 'Kinship.Jarvis.Tests.ExportProjectMetadataTests'. Reason: No parameterless constructor d...

[Test Failure] Cannot dynamically create an instance of type 'Kinship.Jarvis.Tests.ExportProjectMetadataTests'. Reason: No parameterless constructor defined.
   at System.RuntimeType.ActivatorCache..ctor(RuntimeType rt)
   at System.RuntimeType.ActivatorCache.Create(RuntimeType type)
   at System.RuntimeType.IGenericCacheEntry`1.CreateAndCache(RuntimeType type)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean wrapExceptions)
   at TUnit.Core.MethodDataSourceAttribute.GetOrCreateInstanceAsync(DataGeneratorMetadata metadata, Type targetType)
   at TUnit.Core.MethodDataSourceAttribute.GetDataRowsAsync(DataGeneratorMetadata dataGeneratorMetadata)+MoveNext()
   at TUnit.Core.MethodDataSourceAttribute.GetDataRowsAsync(DataGeneratorMetadata dataGeneratorMetadata)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at TUnit.Engine.Building.TestBuilder.GetInitializedDataRowsAsync(IDataSourceAttribute dataSource, DataGeneratorMetadata dataGeneratorMetadata, CancellationToken cancellationToken)+MoveNext()
   at TUnit.Engine.Building.TestBuilder.GetInitializedDataRowsAsync(IDataSourceAttribute dataSource, DataGeneratorMetadata dataGeneratorMetadata, CancellationToken cancellationToken)+MoveNext()
   at TUnit.Engine.Building.TestBuilder.GetInitializedDataRowsAsync(IDataSourceAttribute dataSource, DataGeneratorMetadata dataGeneratorMetadata, CancellationToken cancellationToken)+System.Threading.Tasks.Sources.IValueTaskSource<System.Boolean>.GetResult()
   at TUnit.Engine.Building.TestBuilder.BuildTestsFromMetadataAsync(TestMetadata metadata, TestBuildingContext buildingContext, CancellationToken cancellationToken)
   at TUnit.Engine.Building.TestBuilder.BuildTestsFromMetadataAsync(TestMetadata metadata, TestBuildingContext buildingContext, CancellationToken cancellationToken)
   at TUnit.Engine.Building.TestBuilder.BuildTestsFromMetadataAsync(TestMetadata metadata, TestBuildingContext buildingContext, CancellationToken cancellationToken)

Additional Context

No response

IDE-Specific Issue?

  • I've confirmed this issue occurs when running via dotnet test or dotnet run, not just in my IDE

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions