DRN.Framework.Testing 0.1.0-preview009

Prefix Reserved
This is a prerelease version of DRN.Framework.Testing.
There is a newer version of this package available.
See the version list below for details.
dotnet add package DRN.Framework.Testing --version 0.1.0-preview009
                    
NuGet\Install-Package DRN.Framework.Testing -Version 0.1.0-preview009
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DRN.Framework.Testing" Version="0.1.0-preview009" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DRN.Framework.Testing" Version="0.1.0-preview009" />
                    
Directory.Packages.props
<PackageReference Include="DRN.Framework.Testing" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add DRN.Framework.Testing --version 0.1.0-preview009
                    
#r "nuget: DRN.Framework.Testing, 0.1.0-preview009"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package DRN.Framework.Testing@0.1.0-preview009
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=DRN.Framework.Testing&version=0.1.0-preview009&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=DRN.Framework.Testing&version=0.1.0-preview009&prerelease
                    
Install as a Cake Tool

master develop Quality Gate Status

Security Rating Maintainability Rating Reliability Rating Vulnerabilities Bugs Lines of Code Coverage

DRN.Framework.Testing package provides practical, effective helpers such as resourceful data attributes and test context.

This package enables a new encouraging testing technique called as DTT(Duran's Testing Technique). With DTT, any developer can write clean and hassle-free unit and integration tests without complexity.

Following packages are encapsulated with this package and no longer needed to be referenced in your test project:

  • AutoFixture.AutoNSubstitute
  • AutoFixture.Xunit2
  • DRN.Framework.Utils
  • FluentAssertions
  • NSubstitute
  • xunit

Quickstart

Here's a basic test demonstration to get you started:

public class DataInlineContextAttributeTests
{
    [Theory]
    [DataInlineContext]
    public void DataInlineContextDemonstration(TestContext context, IMockable autoInlinedDependency)
    {
        autoInlinedDependency.Max.Returns(int.MaxValue); //dependency is mocked by NSubstitute

        context.ServiceCollection.AddApplicationServices(); //you can add services, modules defined in hosted app, application, infrastructure layer etc..
        var serviceProvider = context.BuildServiceProvider(); //appsettings.json added by convention. Context and service provider will be disposed by xunit
        var dependentService = serviceProvider.GetRequiredService<DependentService>(); //context replaces actual dependencies with auto inlined dependencies

        dependentService.Max.Should().Be(int.MaxValue);
    }
} 

Testing models used in demonstration:


public static class ApplicationModule //Can be defined in Application Layer or in Hosted App
{
    public static void AddApplicationServices(this IServiceCollection serviceCollection)
    {
        serviceCollection.AddTransient<IMockable, ToBeRemovedService>(); //will be removed by test context because test method requested mocked interface
        serviceCollection.AddTransient<DependentService>(); //dependent service uses IMockable and Max property returns dependency's Max value
    }
}

public interface IMockable
{
    public int Max { get; }
}

public class ToBeRemovedService : IMockable
{
    public int Max { get; set; }
}

public class DependentService : IMockable
{
    private readonly IMockable _mockable;

    public DependentService(IMockable mockable)
    {
        _mockable = mockable;
    }

    public int Max => _mockable.Max;
}

Advanced Data Inline

  • DataInlineContext will provide TestContext as first parameter.
  • Then it will provide inlined values.
  • Then it will provide auto inline missing values with AutoFixture.
  • AutoFixture will mock any interface requested with NSubstitute.
/// <param name="context"> Provided by DataInlineContext even if it is not a compile time constant</param>
/// <param name="inlineData">Provided by DataInlineContext</param>
/// <param name="autoInlinedData">DataInlineContext will provide missing data with the help of AutoFixture</param>
/// <param name="autoInlinedMockable">DataInlineContext will provide implementation mocked by NSubstitute</param>
[Theory]
[DataInlineContext(99)]
public void TextContext_Should_Be_Created_From_TestContextData(TestContext context, int inlineData, Guid autoInlinedData, IMockable autoInlinedMockable)
{
    inlineData.Should().Be(99);
    autoInlinedData.Should().NotBeEmpty(); //guid generated by AutoFixture
    autoInlinedMockable.Max.Returns(int.MaxValue); //dependency mocked by NSubstitute

    context.ServiceCollection.AddApplicationServices(); //you can add services, modules defined in hosted app, application, infrastructure layer etc..
    var serviceProvider = context.BuildServiceProvider(); //appsettings.json added by convention. Context and service provider will be disposed by xunit
    serviceProvider.GetService<ToBeRemovedService>().Should().BeNull(); //Service provider behaviour demonstration

    var dependentService = serviceProvider.GetRequiredService<DependentService>();
    dependentService.Max.Should().Be(int.MaxValue);
}

TestContext

TestContext has following properties:

  • captures values provided to running test method and its method info.
  • provides ServiceCollection so that to be tested services and dependencies can be added before building ServiceProvider.
  • provides lightweight ServiceProvider that contains default logging without any provider
    • ServiceProvider can provide services that depends like ILogger<DefaultService>
    • logged data will not be leaked to anywhere since it has no logging provider.
  • ServiceProvider provides IConfiguration and IAppSettings with SettingsProvider.
    • SettingsProvider reads json settings files that can be found in the settings folder of the test project
    • Make sure file is copied to output directory
    • If no settings file is specified while calling BuildServiceProvider appsettings.json file be searched by convention.
  • ServiceProvider provides utils provided with DRN.Framework.Utils' UtilsModule
  • BuildServiceProvider replaces dependencies that can be replaced with inlined interfaces.
  • ServiceProvider and TestContext will be disposed by xunit when test finishes

Data Attributes

DRN.Framework.Testing provides following data attributes that can provide data to tests:

  • DataInlineAutoAttribute
  • DataInlineContextAttribute
  • DataMemberAutoAttribute
  • DataMemberContextAttribute
  • DataSelfAutoAttribute
  • DataSelfContextAttribute

Following design principle is used for these attributes

  • All attributes has data prefix to benefit from autocomplete
  • Inline attributes works like xunit InlineData except they try to provide missing values with AutoFixture and NSubstitute
  • Member attributes works like xunit MemberData except they try to provide missing values with AutoFixture and NSubstitute
  • Self attributes needs to be inherited by another class and should call AddRow method in constructor to provide data
  • Context attributes provide TestContext as first parameter

Member Attributes

Example usages for member attributes

[Theory]
[DataMemberAuto(nameof(DataMemberAutoData))]
public void AutoMember_Should_Inline_And_Auto_Generate_Missing_Test_Data(int inline, ComplexInline complexInline, Guid autoGenerate, IMockable mock)
{
    inline.Should().BeGreaterThan(10);
    complexInline.Count.Should().BeLessThan(10);
    autoGenerate.Should().NotBeEmpty();
    mock.Max.Returns(75);
    mock.Max.Should().Be(75);
}

public static IEnumerable<object[]> DataMemberAutoData => new List<object[]>
{
    new object[] { 11, new ComplexInline(8) },
    new object[] { int.MaxValue, new ComplexInline(-1) }
};
[Theory]
[DataMemberContext(nameof(TestContextInlineMemberData))]
public void TestContextMember_Should_Inline_And_Auto_Generate_Missing_Test_Data(TestContext testContext,
    int inline, ComplexInline complexInline, Guid autoGenerate, IMockable mock)
{
    testContext.Should().NotBeNull();
    testContext.TestMethod.Name.Should().Be(nameof(TestContextMember_Should_Inline_And_Auto_Generate_Missing_Test_Data));
    inline.Should().BeGreaterThan(10);
    complexInline.Count.Should().BeLessThan(10);
    autoGenerate.Should().NotBeEmpty();
    mock.Max.Returns(75);
    mock.Max.Should().Be(75);
}

public static IEnumerable<object[]> TestContextInlineMemberData => new List<object[]>
{
    new object[] { 11, new ComplexInline(8) },
    new object[] { int.MaxValue, new ComplexInline(-1) }
};

Self Attributes

Example usages for self attributes

public class DataSelfAutoAttributeTests
{
    [Theory]
    [DataSelfAutoTestData]
    public void AutoClass_Should_Inline_And_Auto_Generate_Missing_Test_Data(int inline, ComplexInline complexInline, Guid autoGenerate, IMockable mock)
    {
        inline.Should().BeGreaterThan(10);
        complexInline.Count.Should().BeLessThan(10);
        autoGenerate.Should().NotBeEmpty();
        mock.Max.Returns(75);
        mock.Max.Should().Be(75);
    }
}

public class DataSelfAutoTestData : DataSelfAutoAttribute
{
    public DataSelfAutoTestData()
    {
        AddRow(200, new ComplexInline(9));
        AddRow(300, new ComplexInline(int.MinValue));
    }
}
public class DataSelfContextAttributeTests
{
    [Theory]
    [DataSelfContextTestData]
    public void TestContextClassData_Should_Inline_And_Auto_Generate_Missing_Test_Data(TestContext testContext,
        int inline, ComplexInline complexInline, Guid autoGenerate, IMockable mock)
    {
        testContext.Should().NotBeNull();
        testContext.TestMethod.Name.Should().Be(nameof(TestContextClassData_Should_Inline_And_Auto_Generate_Missing_Test_Data));
        inline.Should().BeGreaterThan(98);
        complexInline.Count.Should().BeLessThan(1001);
        autoGenerate.Should().NotBeEmpty();
        mock.Max.Returns(44);
        mock.Max.Should().Be(44);
    }
}

public class DataSelfContextTestData : DataSelfContextAttribute
{
    public DataSelfContextTestData1()
    {
        AddRow(99,new ComplexInline(100));
        AddRow(199,new ComplexInline(1000));
    }
}

Inline Attributes

Example usages for inline attributes

[Theory]
[DataInlineAuto(10)]
public void AutoInline_Should_Inline_And_Auto_Generate_Missing_Test_Data(int inline, Guid autoGenerate, IMockable mock)
{
    inline.Should().Be(10);
    autoGenerate.Should().NotBeEmpty();
    mock.Max.Returns(65);
    mock.Max.Should().Be(65);
}
[Theory]
[DataInlineContext(99)]
public void TextContext_Should_Be_Created_From_TestContextData(TestContext context, int inlineData, Guid autoInlinedData, IMockable autoInlinedMockable)
{
    inlineData.Should().Be(99);
    autoInlinedData.Should().NotBeEmpty(); //guid generated by AutoFixture
    autoInlinedMockable.Max.Returns(int.MaxValue); //dependency mocked by NSubstitute

    context.ServiceCollection.AddApplicationServices(); //you can add services, modules defined in hosted app, application, infrastructure layer etc..
    var serviceProvider = context.BuildServiceProvider(); //appsettings.json added by convention. Context and service provider will be disposed by xunit
    serviceProvider.GetService<ToBeRemovedService>().Should().BeNull(); //Service provider behaviour demonstration

    var dependentService = serviceProvider.GetRequiredService<DependentService>();
    dependentService.Max.Should().Be(int.MaxValue);
}

Global Usings

following global usings can be used in a Usings file in test projects to reduce line of code in test files

global using Xunit;
global using AutoFixture;
global using AutoFixture.AutoNSubstitute;
global using AutoFixture.Xunit2;
global using DRN.Framework.Testing;
global using DRN.Framework.Utils.Extensions;
global using DRN.Framework.Utils.Settings;
global using FluentAssertions;
global using Microsoft.Extensions.DependencyInjection;
global using NSubstitute;
global using System.Reflection;
global using System.IO;
global using System.Linq;
global using DRN.Framework.Testing.DataAttributes;

DebugOnly Tests

Following attributes can be used to run test only when the debugger is attached. These attributes does not respect debugger not debug configuration.

  • FactDebuggerOnly
  • TheoryDebuggerOnly

Commit Info

Author: Duran Serkan KILIÇ
Date: 2023-10-29 22:20:04 +0300
Hash: 6ed278f1c39475dd982619b8a35f89635b66d995

Product Compatible and additional computed target framework versions.
.NET net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.7.0-preview062 13 2/11/2026
0.7.0-preview061 81 2/7/2026
0.7.0-preview060 81 1/28/2026
0.7.0-preview059 81 1/26/2026
0.7.0-preview058 82 1/25/2026
0.7.0-preview057 78 1/25/2026
0.7.0-preview056 90 1/10/2026
0.7.0-preview055 267 12/16/2025
0.7.0-preview054 173 12/13/2025
0.7.0-preview053 127 12/12/2025
0.7.0-preview052 437 12/9/2025
0.7.0-preview051 296 12/7/2025
0.7.0-preview050 221 12/7/2025
0.7.0-preview049 185 11/26/2025
0.7.0-preview048 198 11/24/2025
0.7.0-preview047 139 11/7/2025
0.7.0-preview046 202 11/6/2025
0.7.0-preview045 201 11/3/2025
0.7.0-preview044 205 11/2/2025
0.7.0-preview043 140 11/1/2025
0.7.0-preview042 208 10/29/2025
0.7.0-preview041 121 10/25/2025
0.7.0-preview040 177 10/12/2025
0.7.0-preview039 136 10/11/2025
0.7.0-preview038 189 10/8/2025
0.7.0-preview037 195 9/28/2025
0.7.0-preview036 204 9/22/2025
0.7.0-preview035 195 8/31/2025
0.7.0-preview034 201 8/31/2025
0.7.0-preview033 233 8/28/2025
0.7.0-preview032 239 8/27/2025
0.7.0-preview031 195 8/10/2025
0.7.0-preview030 82 8/1/2025
0.7.0-preview029 112 8/1/2025
0.7.0-preview028 108 8/1/2025
0.7.0-preview027 139 7/31/2025
0.7.0-preview026 138 7/29/2025
0.7.0-preview025 150 7/27/2025
0.7.0-preview024 122 7/11/2025
0.7.0-preview023 140 7/11/2025
0.7.0-preview022 185 6/29/2025
0.7.0-preview021 193 6/23/2025
0.7.0-preview020 141 5/31/2025
0.7.0-preview019 215 3/23/2025
0.7.0-preview018 150 3/2/2025
0.7.0-preview017 162 2/23/2025
0.7.0-preview016 194 2/22/2025
0.7.0-preview015 139 2/21/2025
0.7.0-preview014 188 2/20/2025
0.7.0-preview013 165 2/9/2025
0.7.0-preview012 154 2/8/2025
0.7.0-preview011 154 2/2/2025
0.7.0-preview010 151 1/20/2025
0.7.0-preview009 122 1/19/2025
0.7.0-preview008 121 1/16/2025
0.7.0-preview007 138 12/29/2024
0.7.0-preview006 137 12/23/2024
0.7.0-preview005 162 11/27/2024
0.7.0-preview004 132 11/23/2024
0.7.0-preview003 131 11/20/2024
0.7.0-preview002 130 11/17/2024
0.7.0-preview001 151 11/14/2024
0.6.0 209 11/10/2024
0.6.0-preview002 139 11/10/2024
0.6.0-preview001 150 11/10/2024
0.5.1-preview002 140 9/30/2024
0.5.1-preview001 142 9/22/2024
0.5.0 181 8/30/2024
0.5.0-preview011 160 8/30/2024
0.5.0-preview010 170 8/25/2024
0.5.0-preview009 178 8/8/2024
0.5.0-preview008 156 8/7/2024
0.5.0-preview007 143 8/2/2024
0.5.0-preview006 129 7/30/2024
0.5.0-preview005 149 7/27/2024
0.5.0-preview004 155 7/15/2024
0.5.0-preview003 165 6/6/2024
0.5.0-preview002 156 6/5/2024
0.5.0-preview001 190 6/4/2024
0.4.0 157 5/19/2024
0.4.0-preview006 147 5/19/2024
0.4.0-preview005 151 5/12/2024
0.4.0-preview004 162 5/12/2024
0.4.0-preview003 176 5/11/2024
0.4.0-preview002 178 5/8/2024
0.4.0-preview001 198 5/5/2024
0.3.1-preview001 163 4/26/2024
0.3.0 206 4/23/2024
0.3.0-preview002 141 4/23/2024
0.3.0-preview001 151 4/23/2024
0.2.2-preview010 190 4/11/2024
0.2.2-preview009 163 3/18/2024
0.2.2-preview008 169 3/18/2024
0.2.2-preview007 192 3/16/2024
0.2.2-preview006 152 3/11/2024
0.2.2-preview005 145 3/10/2024
0.2.2-preview004 154 3/10/2024
0.2.2-preview003 197 1/22/2024
0.2.2-preview002 167 1/18/2024
0.2.2-preview001 174 1/14/2024
0.2.1 277 1/7/2024
0.2.0 223 12/31/2023
0.2.0-preview009 190 12/31/2023
0.2.0-preview008 178 12/30/2023
0.2.0-preview007 190 12/28/2023
0.2.0-preview006 173 12/27/2023
0.2.0-preview005 171 12/25/2023
0.2.0-preview004 168 12/23/2023
0.2.0-preview003 189 12/20/2023
0.2.0-preview002 205 12/19/2023
0.2.0-preview001 190 12/18/2023
0.1.0 248 11/26/2023
0.1.0-preview013 184 11/26/2023
0.1.0-preview012 154 11/20/2023
0.1.0-preview011 180 11/19/2023
0.1.0-preview010 238 10/30/2023
0.1.0-preview009 175 10/29/2023
0.1.0-preview008 176 10/27/2023
0.1.0-preview007 173 10/11/2023
0.1.0-preview006 175 10/9/2023
0.1.0-preview005 187 10/8/2023
0.1.0-preview004 194 10/8/2023
0.1.0-preview003 193 10/3/2023
0.1.0-preview002 195 10/3/2023
0.1.0-preview001 191 10/2/2023

Not every version includes changes, features or bug fixes. This project can increment version to keep consistency with other DRN.Framework projects.

## Version 0.1.0

### Breaking Changes

### New Features
Following data attributes added:
* DataInlineAutoAttribute
* DataInlineContextAttribute
* DataMemberAutoAttribute
* DataMemberContextAttribute
* DataSelfAutoAttribute
* DataSelfContextAttribute

### Bug Fixes  
 
## Commit Info  
Author: Duran Serkan KILIÇ  
Date: 2023-10-29 22:20:04 +0300  
Hash: 6ed278f1c39475dd982619b8a35f89635b66d995