Testably.Abstractions 2.4.1

Prefix Reserved
There is a newer version of this package available.
See the version list below for details.
dotnet add package Testably.Abstractions --version 2.4.1                
NuGet\Install-Package Testably.Abstractions -Version 2.4.1                
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="Testably.Abstractions" Version="2.4.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Testably.Abstractions --version 2.4.1                
#r "nuget: Testably.Abstractions, 2.4.1"                
#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.
// Install Testably.Abstractions as a Cake Addin
#addin nuget:?package=Testably.Abstractions&version=2.4.1

// Install Testably.Abstractions as a Cake Tool
#tool nuget:?package=Testably.Abstractions&version=2.4.1                

Testably.Abstractions
Nuget Changelog Build Coverage Mutation testing badge

This library is an alternative testing helper for the IFileSystem interfaces from System.IO.Abstractions. These interfaces allow abstracting away all I/O-related functionality from the System.IO namespace.
The testing helper also supports advanced scenarios like

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 ITimeSystem interface abstracts away time-related functionality:
  • The IRandomSystem interface abstracts away functionality related to randomness:
    Random methods implement a thread-safe Shared instance also under .NET Framework and Guid 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 and Testably.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 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 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. 
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
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