DRN.Framework.Testing
0.1.0-preview008
Prefix Reserved
See the version list below for details.
dotnet add package DRN.Framework.Testing --version 0.1.0-preview008
NuGet\Install-Package DRN.Framework.Testing -Version 0.1.0-preview008
<PackageReference Include="DRN.Framework.Testing" Version="0.1.0-preview008" />
<PackageVersion Include="DRN.Framework.Testing" Version="0.1.0-preview008" />
<PackageReference Include="DRN.Framework.Testing" />
paket add DRN.Framework.Testing --version 0.1.0-preview008
#r "nuget: DRN.Framework.Testing, 0.1.0-preview008"
#:package DRN.Framework.Testing@0.1.0-preview008
#addin nuget:?package=DRN.Framework.Testing&version=0.1.0-preview008&prerelease
#tool nuget:?package=DRN.Framework.Testing&version=0.1.0-preview008&prerelease
DRN.Framework.Testing
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
{
/// <param name="context"> Provided by DataInlineContext even if it is not a compile time constant</param>
/// <param name="autoInlinedDependency">DataInlineContext will provide implementation mocked by NSubstitute</param>
[Theory]
[DataInlineContext]
public void DataInlineContextDemonstration(TestContext context, IMockable autoInlinedDependency)
{
autoInlinedDependency.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
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
DataInlineContextwill provideTestContextas first parameter.- Then it will provide inlined values.
- Then it will provide auto inline missing values with AutoFixture.
AutoFixturewill mock any interface requested withNSubstitute.
/// <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
ServiceCollectionso that to be tested services and dependencies can be added before buildingServiceProvider. - provides lightweight
ServiceProviderthat contains default logging without any providerServiceProvidercan provide services that depends likeILogger<DefaultService>- logged data will not be leaked to anywhere since it has no logging provider.
ServiceProviderprovidesIConfigurationandIAppSettingswith 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
BuildServiceProviderappsettings.jsonfile be searched by convention.
ServiceProviderprovides utils provided with DRN.Framework.Utils'UtilsModuleBuildServiceProviderreplaces dependencies that can be replaced with inlined interfaces.ServiceProviderandTestContextwill 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
InlineDataexcept they try to provide missing values with AutoFixture and NSubstitute - Member attributes works like xunit
MemberDataexcept they try to provide missing values with AutoFixture and NSubstitute - Self attributes needs to be inherited by another class and should call
AddRowmethod in constructor to provide data - Context attributes provide
TestContextas 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;
Commit Info
Author: Duran Serkan KILIÇ
Date: 2023-10-28 00:10:40 +0300
Hash: c86d77f1b42c8f428ad4e7723ef7e4e1ee18826b
| Product | Versions 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. |
-
net7.0
- AutoFixture.AutoNSubstitute (>= 4.18.0)
- AutoFixture.Xunit2 (>= 4.18.0)
- DRN.Framework.Utils (>= 0.1.0-preview008)
- FluentAssertions (>= 6.12.0)
- NSubstitute (>= 5.0.0)
- xunit (>= 2.5.0)
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-preview041 | 29 | 10/25/2025 |
| 0.7.0-preview040 | 144 | 10/12/2025 |
| 0.7.0-preview039 | 98 | 10/11/2025 |
| 0.7.0-preview038 | 166 | 10/8/2025 |
| 0.7.0-preview037 | 165 | 9/28/2025 |
| 0.7.0-preview036 | 176 | 9/22/2025 |
| 0.7.0-preview035 | 169 | 8/31/2025 |
| 0.7.0-preview034 | 170 | 8/31/2025 |
| 0.7.0-preview033 | 208 | 8/28/2025 |
| 0.7.0-preview032 | 201 | 8/27/2025 |
| 0.7.0-preview031 | 168 | 8/10/2025 |
| 0.7.0-preview030 | 58 | 8/1/2025 |
| 0.7.0-preview029 | 82 | 8/1/2025 |
| 0.7.0-preview028 | 83 | 8/1/2025 |
| 0.7.0-preview027 | 116 | 7/31/2025 |
| 0.7.0-preview026 | 99 | 7/29/2025 |
| 0.7.0-preview025 | 121 | 7/27/2025 |
| 0.7.0-preview024 | 91 | 7/11/2025 |
| 0.7.0-preview023 | 107 | 7/11/2025 |
| 0.7.0-preview022 | 160 | 6/29/2025 |
| 0.7.0-preview021 | 166 | 6/23/2025 |
| 0.7.0-preview020 | 116 | 5/31/2025 |
| 0.7.0-preview019 | 174 | 3/23/2025 |
| 0.7.0-preview018 | 118 | 3/2/2025 |
| 0.7.0-preview017 | 136 | 2/23/2025 |
| 0.7.0-preview016 | 147 | 2/22/2025 |
| 0.7.0-preview015 | 114 | 2/21/2025 |
| 0.7.0-preview014 | 146 | 2/20/2025 |
| 0.7.0-preview013 | 133 | 2/9/2025 |
| 0.7.0-preview012 | 124 | 2/8/2025 |
| 0.7.0-preview011 | 113 | 2/2/2025 |
| 0.7.0-preview010 | 124 | 1/20/2025 |
| 0.7.0-preview009 | 97 | 1/19/2025 |
| 0.7.0-preview008 | 89 | 1/16/2025 |
| 0.7.0-preview007 | 111 | 12/29/2024 |
| 0.7.0-preview006 | 111 | 12/23/2024 |
| 0.7.0-preview005 | 130 | 11/27/2024 |
| 0.7.0-preview004 | 108 | 11/23/2024 |
| 0.7.0-preview003 | 108 | 11/20/2024 |
| 0.7.0-preview002 | 95 | 11/17/2024 |
| 0.7.0-preview001 | 122 | 11/14/2024 |
| 0.6.0 | 174 | 11/10/2024 |
| 0.6.0-preview002 | 103 | 11/10/2024 |
| 0.6.0-preview001 | 122 | 11/10/2024 |
| 0.5.1-preview002 | 119 | 9/30/2024 |
| 0.5.1-preview001 | 126 | 9/22/2024 |
| 0.5.0 | 154 | 8/30/2024 |
| 0.5.0-preview011 | 127 | 8/30/2024 |
| 0.5.0-preview010 | 149 | 8/25/2024 |
| 0.5.0-preview009 | 149 | 8/8/2024 |
| 0.5.0-preview008 | 118 | 8/7/2024 |
| 0.5.0-preview007 | 106 | 8/2/2024 |
| 0.5.0-preview006 | 101 | 7/30/2024 |
| 0.5.0-preview005 | 126 | 7/27/2024 |
| 0.5.0-preview004 | 119 | 7/15/2024 |
| 0.5.0-preview003 | 133 | 6/6/2024 |
| 0.5.0-preview002 | 131 | 6/5/2024 |
| 0.5.0-preview001 | 144 | 6/4/2024 |
| 0.4.0 | 136 | 5/19/2024 |
| 0.4.0-preview006 | 113 | 5/19/2024 |
| 0.4.0-preview005 | 117 | 5/12/2024 |
| 0.4.0-preview004 | 137 | 5/12/2024 |
| 0.4.0-preview003 | 142 | 5/11/2024 |
| 0.4.0-preview002 | 151 | 5/8/2024 |
| 0.4.0-preview001 | 169 | 5/5/2024 |
| 0.3.1-preview001 | 128 | 4/26/2024 |
| 0.3.0 | 177 | 4/23/2024 |
| 0.3.0-preview002 | 109 | 4/23/2024 |
| 0.3.0-preview001 | 123 | 4/23/2024 |
| 0.2.2-preview010 | 157 | 4/11/2024 |
| 0.2.2-preview009 | 143 | 3/18/2024 |
| 0.2.2-preview008 | 148 | 3/18/2024 |
| 0.2.2-preview007 | 161 | 3/16/2024 |
| 0.2.2-preview006 | 121 | 3/11/2024 |
| 0.2.2-preview005 | 122 | 3/10/2024 |
| 0.2.2-preview004 | 119 | 3/10/2024 |
| 0.2.2-preview003 | 176 | 1/22/2024 |
| 0.2.2-preview002 | 142 | 1/18/2024 |
| 0.2.2-preview001 | 152 | 1/14/2024 |
| 0.2.1 | 236 | 1/7/2024 |
| 0.2.0 | 195 | 12/31/2023 |
| 0.2.0-preview009 | 159 | 12/31/2023 |
| 0.2.0-preview008 | 159 | 12/30/2023 |
| 0.2.0-preview007 | 164 | 12/28/2023 |
| 0.2.0-preview006 | 135 | 12/27/2023 |
| 0.2.0-preview005 | 147 | 12/25/2023 |
| 0.2.0-preview004 | 148 | 12/23/2023 |
| 0.2.0-preview003 | 166 | 12/20/2023 |
| 0.2.0-preview002 | 166 | 12/19/2023 |
| 0.2.0-preview001 | 160 | 12/18/2023 |
| 0.1.0 | 231 | 11/26/2023 |
| 0.1.0-preview013 | 159 | 11/26/2023 |
| 0.1.0-preview012 | 138 | 11/20/2023 |
| 0.1.0-preview011 | 151 | 11/19/2023 |
| 0.1.0-preview010 | 195 | 10/30/2023 |
| 0.1.0-preview009 | 139 | 10/29/2023 |
| 0.1.0-preview008 | 152 | 10/27/2023 |
| 0.1.0-preview007 | 151 | 10/11/2023 |
| 0.1.0-preview006 | 153 | 10/9/2023 |
| 0.1.0-preview005 | 163 | 10/8/2023 |
| 0.1.0-preview004 | 161 | 10/8/2023 |
| 0.1.0-preview003 | 164 | 10/3/2023 |
| 0.1.0-preview002 | 175 | 10/3/2023 |
| 0.1.0-preview001 | 158 | 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-28 00:10:40 +0300
Hash: c86d77f1b42c8f428ad4e7723ef7e4e1ee18826b