Skip to content

Write testable code by abstracting away system dependencies.

License

Notifications You must be signed in to change notification settings

Testably/Testably.Abstractions

Repository files navigation

Testably.Abstractions Nuget Build Codacy Badge 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.
In addition, the following interfaces are defined:

  • The ITimeSystem interface abstracts away time-related functionality:
    DateTime methods give access to the current time, Thread allows replacing Thread.Sleep and Task allows replacing Task.Delay.
  • 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 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.

About

Write testable code by abstracting away system dependencies.

Resources

License

Code of conduct

Stars

Watchers

Forks

Languages