Testably.Abstractions
2.6.0
Prefix Reserved
See the version list below for details.
dotnet add package Testably.Abstractions --version 2.6.0
NuGet\Install-Package Testably.Abstractions -Version 2.6.0
<PackageReference Include="Testably.Abstractions" Version="2.6.0" />
<PackageVersion Include="Testably.Abstractions" Version="2.6.0" />
<PackageReference Include="Testably.Abstractions" />
paket add Testably.Abstractions --version 2.6.0
#r "nuget: Testably.Abstractions, 2.6.0"
#:package Testably.Abstractions@2.6.0
#addin nuget:?package=Testably.Abstractions&version=2.6.0
#tool nuget:?package=Testably.Abstractions&version=2.6.0
This library is a feature complete testing helper for the IFileSystem abstractions for I/O-related functionality from the System.IO namespace. It uses an in-memory file system that behaves exactly like the real file system and can be used in unit tests for dependency injection.
The testing helper also supports advanced scenarios like
- Multiple drives with limited size
FileSystemWatcherand- a way to work with SafeFileHandles
The companion projects Testably.Abstractions.Compression and Testably.Abstractions.AccessControl allow working with Zip-Files and Access Control Lists respectively.
As the test suite runs both against the mocked and the real file system, the behaviour between the two is identical.
In addition, the following interfaces are defined:
- The
ITimeSysteminterface abstracts away time-related functionality:DateTimemethods give access to the current timeTaskallows replacingTask.DelayThreadallows replacingThread.SleepTimeris a wrapper aroundSystem.Threading.Timer
- The
IRandomSysteminterface abstracts away functionality related to randomness:
Randommethods implement a thread-safe Shared instance also under .NET Framework andGuidmethods 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.Abstractionsas nuget package in your productive projects andTestably.Abstractions.Testingas nuget package in your test projects.dotnet add package Testably.Abstractions dotnet add package Testably.Abstractions.TestingConfigure your dependeny injection framework, e.g. with
Microsoft.Extensions.DependencyInjectionsin 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 project provides mocked instances for the abstraction interfaces:
These mocks are configured using fluent syntax:
new MockFileSystem()
.WithDrive("D:", d => d
.SetTotalSize(1024 * 1024))
.InitializeIn("D:")
.WithFile("foo.txt")
.WithSubdirectory("sub-dir").Initialized(s => s
.WithAFile(".json").Which(
f => f.HasStringContent("{\"count\":1}")));
Initializes the mocked file system with a second drive D: with 1MB total available space and creates on it an empty text file foo.txt and a directory sub-dir which contains randomly named json file with {"count":1} as file content.
| 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 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. 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. |
| .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 (>= 2.6.0)
-
.NETStandard 2.1
- Testably.Abstractions.Interface (>= 2.6.0)
-
net6.0
- Testably.Abstractions.Interface (>= 2.6.0)
-
net7.0
- Testably.Abstractions.Interface (>= 2.6.0)
-
net8.0
- Testably.Abstractions.Interface (>= 2.6.0)
NuGet packages (6)
Showing the top 5 NuGet packages that depend on Testably.Abstractions:
| Package | Downloads |
|---|---|
|
MyLittleContentEngine
A powerful content engine for building static sites with Blazor and ASP.NET Core |
|
|
AnakinRaW.CommonUtilities
Provides common classes and utilities for personal use. |
|
|
AnakinRaW.CommonUtilities.FileSystem
Helper classes and methods targeting the file system. |
|
|
ktsu.Abstractions
A library providing a comprehensive set of interfaces for compression, encryption, hashing, obfuscation, serialization, and filesystem access with zero-allocation Try* methods and convenient default implementations. |
|
|
AlamoEngineTools.Modinfo
.NET implementation of the eaw.modinfo specification (https://github.com/AlamoEngine-Tools/eaw.modinfo) to locate and validate EaW modinfo JSON files. |
GitHub repositories (2)
Showing the top 2 popular GitHub repositories that depend on Testably.Abstractions:
| Repository | Stars |
|---|---|
|
Monitor221hz/Pandora-Behaviour-Engine-Plus
Patcher for behavior, character, and skeleton project files for Skyrim Special Edition.
|
|
|
TeamWheelWizard/WheelWizard
WheelWizard, Retro Rewind Launcher
|
| Version | Downloads | Last Updated |
|---|---|---|
| 10.0.0 | 738 | 11/12/2025 |
| 10.0.0-pre.1 | 102 | 8/15/2025 |
| 9.0.0 | 40,036 | 1/31/2025 |
| 9.0.0-pre.2 | 80 | 1/31/2025 |
| 9.0.0-pre.1 | 84 | 1/30/2025 |
| 3.2.4 | 13,843 | 11/12/2024 |
| 3.2.3 | 17,701 | 8/16/2024 |
| 3.2.2 | 1,056 | 7/17/2024 |
| 3.2.1 | 2,789 | 5/16/2024 |
| 3.2.0 | 483 | 5/5/2024 |
| 3.1.2 | 637 | 4/9/2024 |
| 3.1.1 | 191 | 4/7/2024 |
| 3.1.0 | 269 | 4/1/2024 |
| 3.0.1 | 204 | 3/30/2024 |
| 3.0.0 | 228 | 3/29/2024 |
| 2.6.1 | 20,643 | 1/7/2024 |
| 2.6.0 | 1,625 | 11/16/2023 |
| 2.5.1 | 216 | 11/16/2023 |
| 2.5.0 | 1,149 | 10/7/2023 |
| 2.4.1 | 549 | 8/23/2023 |
| 2.4.0 | 216 | 8/23/2023 |
| 2.3.4 | 4,320 | 8/1/2023 |
| 2.3.3 | 3,549 | 7/24/2023 |
| 2.3.2 | 1,622 | 7/17/2023 |
| 2.3.1 | 2,121 | 5/15/2023 |
| 2.3.0 | 245 | 5/12/2023 |
| 2.2.2 | 4,514 | 4/18/2023 |
| 2.2.1 | 363 | 4/16/2023 |
| 2.2.0 | 285 | 4/10/2023 |
| 2.1.0 | 1,107 | 3/7/2023 |
| 2.0.1 | 654 | 2/6/2023 |
| 2.0.0 | 2,339 | 12/18/2022 |
| 1.0.0 | 472 | 11/18/2022 |
