StoicDreams.TestFramework
1.6.0
See the version list below for details.
dotnet add package StoicDreams.TestFramework --version 1.6.0
NuGet\Install-Package StoicDreams.TestFramework -Version 1.6.0
<PackageReference Include="StoicDreams.TestFramework" Version="1.6.0" />
paket add StoicDreams.TestFramework --version 1.6.0
#r "nuget: StoicDreams.TestFramework, 1.6.0"
// Install StoicDreams.TestFramework as a Cake Addin #addin nuget:?package=StoicDreams.TestFramework&version=1.6.0 // Install StoicDreams.TestFramework as a Cake Tool #tool nuget:?package=StoicDreams.TestFramework&version=1.6.0
Stoic Dreams Test Framework
Nuget: www.nuget.org/packages/StoicDreams.TestFramework
GitHub: github.com/StoicDreams/TestFramework
This library includes an abstract
class called TestFramework
that developers can inherit from their test classes to access helper methods for unit and integration tests.
Functionality includes extending and simplifying functionality from the NSubstitute
mocking framework (We moved away from Moq
over security concerns that came up with their 4.20
release.)
Project Goals
The goal of this library is to provide a framework to use in unit tests and integration tests that grealy simplify organizing tests using the Arrange / Act / Assert testing pattern.
Framework Features
- Inclusion of NSubstitute mocking framework to use for mocking components.
- Inclusion of FluentAssertions framework to use for human readable assertions.
- Automatic default mocking (using NSubstitute's Mock framework) of a class's constructor dependencies when running unit tests.
- Test framework agnostic: While we use XUnit, we have no restrictions against using other frameworks such as NUnit, MSTest, etc.
Noted Restrictions
This framework assumes use of IServiceCollection and IServiceProvider to handle dependency injection. And so, also uses ServiceCollection to manage components and build IServiceProvider which is used to handle dependency injection.
Because of this usage:
- Classes being tested with
TestFramework.ArrangeUnitTest
should have a single public constructor. If a class has multiple public constructors it will use the first one.
Setting up your Test Project
Add the StoicDreams.TestFramework Nuget package to your test project.
<ItemGroup>
<PackageReference Include="StoicDreams.TestFramework" Version="1.6.0" />
</ItemGroup>
Add assembly settings that will allow testing to access internal classes for the projects you are testing.
This update needs to be added to any project that utilizes internal
classes.
Usings.cs
// Your existing global using statements
global using System;
...
// Add these 2 lines to allow testing to access internal classes
using System.Runtime.CompilerServices;
// Needed by the testing framework to access internals during reflection for automated mocking
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
// Reference your test project so it can see your main projects internals
[assembly: InternalsVisibleTo("MyCompany.MyApp.Tests")]
Inherit the StoicDreams.TestFramework class in all test files.
ExampleTests.cs
(See a full example on GitHub)
namespace MyCompany.MyApp;
public class SampleChildATests : StoicDreams.TestFramework
{
[Theory]
[InlineData("Test One")]
[InlineData("Test Two")]
public void Verify_DoSomething_ReturnsExpectedData(string input)
{
ArrangeUnitTest<SampleParent>(options =>
{
options.GetMock<ISampleChildA>().DoSomething(input).Returns($"Mock A: {input}");
options.GetMock<ISampleChildB>().DoSomething(input).Returns($"Mock B: {input}");
})
.Act(arrangment => arrangment.Service.DoSomething(input))
.Assert(arrangement =>
{
string? result = arrangement.GetResult<string>();
result.Should().NotBeNullOrWhiteSpace();
result.Should().BeEquivalentTo($"Parent: Mock A: {input} - Mock B: {input}");
});
}
}
Author
Erik Gassler - Stoic Dreams - Forging solutions for tomorrow's software development.
Support - Visit Stoic Dreams' GitHub Sponsor page if you would like to provide support.
Software Development Standards - Check out my Simple-Holistic-Agile Software Engineering Standards website to see my standards for developing software.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. 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. |
-
net8.0
- FluentAssertions (>= 6.12.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- NSubstitute (>= 5.1.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on StoicDreams.TestFramework:
Package | Downloads |
---|---|
StoicDreams.TestFramework.Blazor
Extended functionality of Stoic Dreams Test Framework, adding funtionality to handle testing against rendered .razor components for unit and integration testing. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.6.7 | 1,180 | 5/25/2024 |
1.6.6 | 107 | 5/25/2024 |
1.6.5 | 117 | 5/24/2024 |
1.6.4 | 134 | 5/24/2024 |
1.6.3 | 1,153 | 1/4/2024 |
1.6.2 | 519 | 12/7/2023 |
1.6.1 | 265 | 11/16/2023 |
1.6.0 | 205 | 11/15/2023 |
1.5.16 | 205 | 11/15/2023 |
1.5.15 | 1,083 | 10/17/2023 |
1.5.14 | 1,390 | 8/29/2023 |
1.5.13 | 696 | 8/17/2023 |
1.5.12 | 515 | 8/11/2023 |
1.5.11 | 299 | 8/11/2023 |
1.5.10 | 299 | 8/11/2023 |
1.5.9 | 299 | 8/11/2023 |
1.5.8 | 308 | 8/11/2023 |
1.5.7 | 298 | 8/11/2023 |
1.5.6 | 288 | 8/11/2023 |
1.5.5 | 302 | 8/11/2023 |
1.5.4 | 317 | 8/11/2023 |
1.5.3 | 293 | 8/11/2023 |
1.5.2 | 170 | 8/10/2023 |
1.5.1 | 147 | 8/10/2023 |
1.4.53 | 318 | 7/30/2023 |
1.4.51 | 4,498 | 4/4/2023 |
1.4.50 | 337 | 4/4/2023 |
1.4.49 | 1,546 | 3/1/2023 |
1.4.48 | 1,174 | 2/3/2023 |
1.4.40 | 528 | 1/24/2023 |
1.4.37 | 412 | 1/24/2023 |
1.4.36 | 727 | 1/5/2023 |
1.4.32 | 444 | 1/5/2023 |
1.4.31 | 443 | 1/5/2023 |
1.4.30 | 438 | 1/5/2023 |
1.4.21 | 501 | 1/3/2023 |
1.4.20 | 506 | 12/12/2022 |
1.4.9 | 932 | 9/20/2022 |
1.4.7 | 789 | 8/28/2022 |
1.4.2 | 1,191 | 8/11/2022 |
1.4.1 | 4,921 | 7/17/2022 |
1.3.1 | 694 | 7/17/2022 |
1.2.12 | 674 | 7/17/2022 |
1.2.11 | 726 | 7/11/2022 |
1.2.10 | 680 | 7/9/2022 |
1.2.8 | 713 | 7/9/2022 |
1.2.7 | 692 | 7/9/2022 |
1.2.6 | 699 | 7/9/2022 |
1.2.4 | 679 | 7/9/2022 |
1.2.3 | 664 | 7/8/2022 |
1.1.14 | 684 | 7/8/2022 |
1.1.13 | 689 | 7/8/2022 |
1.1.12 | 401 | 7/8/2022 |
1.1.11 | 405 | 7/8/2022 |
1.1.10 | 402 | 7/8/2022 |
1.1.9 | 688 | 7/8/2022 |
1.1.5 | 410 | 7/8/2022 |
1.0.4 | 429 | 7/7/2022 |
1.0.3 | 426 | 7/4/2022 |
1.0.2 | 391 | 7/3/2022 |
0.1.13 | 417 | 7/3/2022 |
0.1.12 | 401 | 7/3/2022 |
0.1.11 | 413 | 7/3/2022 |
0.1.10 | 409 | 7/3/2022 |
0.1.9 | 422 | 7/3/2022 |
Development Release