Testably.Abstractions
1.0.0
Prefix Reserved
See the version list below for details.
dotnet add package Testably.Abstractions --version 1.0.0
NuGet\Install-Package Testably.Abstractions -Version 1.0.0
<PackageReference Include="Testably.Abstractions" Version="1.0.0" />
paket add Testably.Abstractions --version 1.0.0
#r "nuget: Testably.Abstractions, 1.0.0"
// Install Testably.Abstractions as a Cake Addin #addin nuget:?package=Testably.Abstractions&version=1.0.0 // Install Testably.Abstractions as a Cake Tool #tool nuget:?package=Testably.Abstractions&version=1.0.0
At the core of this library are the abstraction interfaces, which allow replacing system dependencies:
- The
IFileSystem
interface abstracts away all I/O-related functionality from theSystem.IO
namespace:
Static methods are directly implemented on theIFileSystem
interface. Constructors are implemented as factory methods, e.g.IFileSystem.FileInfo.New(string)
instead ofnew FileInfo(string)
. - The
ITimeSystem
interface abstracts away time-related functionality:
DateTime
methods give access to the current time,Thread
allows replacingThread.Sleep
andTask
allows replacingTask.Delay
. - The
IRandomSystem
interface abstracts away functionality related to randomness:
Random
methods implement a thread-safe Shared instance also under .NET Framework andGuid
methods allow creating new GUIDs.
Example
Use the interfaces and their default implementations using your prefered dependency injection method, e.g.:
private readonly IFileSystem _fileSystem;
public class MyService(IFileSystem fileSystem)
{
_fileSystem = fileSystem;
}
public void StoreData()
{
var fileContent = GetFileContent();
_fileSystem.File.WriteAllText("result.xml", fileContent);
}
private string GetFileContent()
{
// Generate the file content
}
Then you test your class with the mocked types in Testably.Abstractions.Testing
:
[Fact]
public void StoreData_ShouldWriteValidFile()
{
IFileSystem fileSystem = new MockFileSystem();
MyService sut = new MyService(fileSystem);
sut.StoreData();
var fileContent = fileSystem.File.ReadAllText("result.xml");
// Validate fileContent
}
More examples can be found in the examples section!
Getting Started
Install
Testably.Abstractions
as nuget package in your productive projects andTestably.Abstractions.Testing
as nuget package in your test projects.dotnet add package Testably.Abstractions dotnet add package Testably.Abstractions.Testing
Configure your dependeny injection framework, e.g. with
Microsoft.Extensions.DependencyInjections
in ASP.NET core:builder.Services .AddSingleton<IFileSystem, RealFileSystem>() .AddSingleton<IRandomSystem, RealRandomSystem>() .AddSingleton<ITimeSystem, RealTimeSystem>();
You can now use the interfaces in your services!
Testing
In order to simplify testing, the Testably.Abstractions.Testing
projects provides mocked instances for the abstraction interfaces:
These mocks are configured using fluent syntax:
new MockFileSystem()
.WithDrive("D:", d => d
.SetTotalSize(1024*1024))
.Initialize()
.WithAFile()
.WithASubdirectory().Initialized(s => s
.WithAFile(".txt"));
Initializes the mocked file system with a second drive D:
with 1MB total available space and creates on the default drive C:
a random file and a random sub-directory containing a ".txt" file.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. 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. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Testably.Abstractions.Interface (>= 1.0.0)
-
.NETStandard 2.1
- Testably.Abstractions.Interface (>= 1.0.0)
-
net6.0
- Testably.Abstractions.Interface (>= 1.0.0)
-
net7.0
- Testably.Abstractions.Interface (>= 1.0.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 |
---|---|---|
3.2.4 | 3,324 | 11/12/2024 |
3.2.3 | 9,040 | 8/16/2024 |
3.2.2 | 987 | 7/17/2024 |
3.2.1 | 2,645 | 5/16/2024 |
3.2.0 | 403 | 5/5/2024 |
3.1.2 | 535 | 4/9/2024 |
3.1.1 | 121 | 4/7/2024 |
3.1.0 | 198 | 4/1/2024 |
3.0.1 | 139 | 3/30/2024 |
3.0.0 | 119 | 3/29/2024 |
2.6.1 | 11,829 | 1/7/2024 |
2.6.0 | 1,540 | 11/16/2023 |
2.5.1 | 138 | 11/16/2023 |
2.5.0 | 1,068 | 10/7/2023 |
2.4.1 | 438 | 8/23/2023 |
2.4.0 | 147 | 8/23/2023 |
2.3.4 | 4,208 | 8/1/2023 |
2.3.3 | 3,465 | 7/24/2023 |
2.3.2 | 1,542 | 7/17/2023 |
2.3.1 | 2,021 | 5/15/2023 |
2.3.0 | 160 | 5/12/2023 |
2.2.2 | 2,844 | 4/18/2023 |
2.2.1 | 231 | 4/16/2023 |
2.2.0 | 189 | 4/10/2023 |
2.1.0 | 1,010 | 3/7/2023 |
2.0.1 | 558 | 2/6/2023 |
2.0.0 | 2,244 | 12/18/2022 |
1.0.0 | 365 | 11/18/2022 |