TestableIO.System.IO.Abstractions.TestingHelpers
22.0.13
Prefix Reserved
See the version list below for details.
dotnet add package TestableIO.System.IO.Abstractions.TestingHelpers --version 22.0.13
NuGet\Install-Package TestableIO.System.IO.Abstractions.TestingHelpers -Version 22.0.13
<PackageReference Include="TestableIO.System.IO.Abstractions.TestingHelpers" Version="22.0.13" />
<PackageVersion Include="TestableIO.System.IO.Abstractions.TestingHelpers" Version="22.0.13" />
<PackageReference Include="TestableIO.System.IO.Abstractions.TestingHelpers" />
paket add TestableIO.System.IO.Abstractions.TestingHelpers --version 22.0.13
#r "nuget: TestableIO.System.IO.Abstractions.TestingHelpers, 22.0.13"
#addin nuget:?package=TestableIO.System.IO.Abstractions.TestingHelpers&version=22.0.13
#tool nuget:?package=TestableIO.System.IO.Abstractions.TestingHelpers&version=22.0.13
At the core of the library is IFileSystem
and FileSystem
. Instead of calling methods like File.ReadAllText
directly, use IFileSystem.File.ReadAllText
. We have exactly the same API, except that ours is injectable and testable.
Usage
dotnet add package TestableIO.System.IO.Abstractions.Wrappers
Note: This NuGet package is also published as System.IO.Abstractions
but we suggest to use the prefix to make clear that this is not an official .NET package.
public class MyComponent
{
readonly IFileSystem fileSystem;
// <summary>Create MyComponent with the given fileSystem implementation</summary>
public MyComponent(IFileSystem fileSystem)
{
this.fileSystem = fileSystem;
}
/// <summary>Create MyComponent</summary>
public MyComponent() : this(
fileSystem: new FileSystem() //use default implementation which calls System.IO
)
{
}
public void Validate()
{
foreach (var textFile in fileSystem.Directory.GetFiles(@"c:\", "*.txt", SearchOption.TopDirectoryOnly))
{
var text = fileSystem.File.ReadAllText(textFile);
if (text != "Testing is awesome.")
throw new NotSupportedException("We can't go on together. It's not me, it's you.");
}
}
}
Test helpers
The library also ships with a series of test helpers to save you from having to mock out every call, for basic scenarios. They are not a complete copy of a real-life file system, but they'll get you most of the way there.
dotnet add package TestableIO.System.IO.Abstractions.TestingHelpers
Note: This NuGet package is also published as System.IO.Abstractions.TestingHelpers
but we suggest to use the prefix to make clear that this is not an official .NET package.
[Test]
public void MyComponent_Validate_ShouldThrowNotSupportedExceptionIfTestingIsNotAwesome()
{
// Arrange
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
{
{ @"c:\myfile.txt", new MockFileData("Testing is meh.") },
{ @"c:\demo\jQuery.js", new MockFileData("some js") },
{ @"c:\demo\image.gif", new MockFileData(new byte[] { 0x12, 0x34, 0x56, 0xd2 }) }
});
var component = new MyComponent(fileSystem);
try
{
// Act
component.Validate();
}
catch (NotSupportedException ex)
{
// Assert
Assert.That(ex.Message, Is.EqualTo("We can't go on together. It's not me, it's you."));
return;
}
Assert.Fail("The expected exception was not thrown.");
}
We even support casting from the .NET Framework's untestable types to our testable wrappers:
FileInfo SomeApiMethodThatReturnsFileInfo()
{
return new FileInfo("a");
}
void MyFancyMethod()
{
var testableFileInfo = (FileInfoBase)SomeApiMethodThatReturnsFileInfo();
...
}
Mock support
Since version 4.0 the top-level APIs expose interfaces instead of abstract base classes (these still exist, though), allowing you to completely mock the file system. Here's a small example, using Moq:
[Test]
public void Test1()
{
var watcher = Mock.Of<IFileSystemWatcher>();
var file = Mock.Of<IFile>();
Mock.Get(file).Setup(f => f.Exists(It.IsAny<string>())).Returns(true);
Mock.Get(file).Setup(f => f.ReadAllText(It.IsAny<string>())).Throws<OutOfMemoryException>();
var unitUnderTest = new SomeClassUsingFileSystemWatcher(watcher, file);
Assert.Throws<OutOfMemoryException>(() => {
Mock.Get(watcher).Raise(w => w.Created += null, new System.IO.FileSystemEventArgs(System.IO.WatcherChangeTypes.Created, @"C:\Some\Directory", "Some.File"));
});
Mock.Get(file).Verify(f => f.Exists(It.IsAny<string>()), Times.Once);
Assert.True(unitUnderTest.FileWasCreated);
}
public class SomeClassUsingFileSystemWatcher
{
private readonly IFileSystemWatcher _watcher;
private readonly IFile _file;
public bool FileWasCreated { get; private set; }
public SomeClassUsingFileSystemWatcher(IFileSystemWatcher watcher, IFile file)
{
this._file = file;
this._watcher = watcher;
this._watcher.Created += Watcher_Created;
}
private void Watcher_Created(object sender, System.IO.FileSystemEventArgs e)
{
FileWasCreated = true;
if(_file.Exists(e.FullPath))
{
var text = _file.ReadAllText(e.FullPath);
}
}
}
Related projects
System.IO.Abstractions.Extensions
provides convenience functionality on top of the core abstractions.System.IO.Abstractions.Analyzers
provides Roslyn analyzers to help use abstractions over static methods.Testably.Abstractions
provides alternative test helpers and additional abstractions.
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 was computed. 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 is compatible. 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. |
.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 is compatible. 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. |
-
.NETFramework 4.7.2
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.0.13)
- Testably.Abstractions.FileSystem.Interface (>= 9.0.0)
-
.NETStandard 2.0
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.0.13)
- Testably.Abstractions.FileSystem.Interface (>= 9.0.0)
-
.NETStandard 2.1
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.0.13)
- Testably.Abstractions.FileSystem.Interface (>= 9.0.0)
-
net6.0
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.0.13)
- Testably.Abstractions.FileSystem.Interface (>= 9.0.0)
-
net8.0
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.0.13)
- Testably.Abstractions.FileSystem.Interface (>= 9.0.0)
-
net9.0
- TestableIO.System.IO.Abstractions.Wrappers (>= 22.0.13)
- Testably.Abstractions.FileSystem.Interface (>= 9.0.0)
NuGet packages (8)
Showing the top 5 NuGet packages that depend on TestableIO.System.IO.Abstractions.TestingHelpers:
Package | Downloads |
---|---|
System.IO.Abstractions.TestingHelpers
A set of pre-built mocks to help when testing file system interactions. |
|
Reo.Core.Testing
Package Description |
|
Reo.Core.IntegrationTesting
Package Description |
|
FastMoq.Core
Easy and fast extension of the famous Moq mocking framework for mocking and auto injection of classes when testing. |
|
SlugEnt.ResourceHealthChecker.FileSystem
File System Resource Health Checker |
GitHub repositories (14)
Showing the top 14 popular GitHub repositories that depend on TestableIO.System.IO.Abstractions.TestingHelpers:
Repository | Stars |
---|---|
gui-cs/Terminal.Gui
Cross Platform Terminal UI toolkit for .NET
|
|
kurrent-io/KurrentDB
EventStoreDB, the event-native database. Designed for Event Sourcing, Event-Driven, and Microservices architectures
|
|
Azure/azure-powershell
Microsoft Azure PowerShell
|
|
stryker-mutator/stryker-net
Mutation testing for .NET core and .NET framework!
|
|
recyclarr/recyclarr
Automatically sync TRaSH Guides to your Sonarr and Radarr instances
|
|
NethermindEth/nethermind
A robust execution client for Ethereum node operators.
|
|
rogerfar/rdt-client
Real-Debrid Client Proxy
|
|
prom3theu5/aspirational-manifests
Handle deployments of .NET Aspire AppHost Projects
|
|
getsentry/sentry-dotnet
Sentry SDK for .NET
|
|
ChaosRecipeEnhancer/ChaosRecipeEnhancer
🟡📈 Streamline your Chaos Recipe gains!
|
|
PlexRipper/PlexRipper
A cross-platform Plex media downloader that seamlessly adds media from other Plex servers to your own!
|
|
MeltyPlayer/FinModelUtility
Model viewer and command-line tools for extracting models from various GCN/3DS/PC games en-masse.
|
|
ZarehD/AspNetStatic
Transform ASP.NET Core into a static site generator.
|
|
kapi2289/InertiaCore
Inertia.js ASP.NET Adapter.
|
Version | Downloads | Last updated |
---|---|---|
22.0.14 | 14,874 | 11 days ago |
22.0.13 | 43,514 | 25 days ago |
22.0.12 | 65,310 | 2 months ago |
22.0.11 | 51,559 | 2 months ago |
22.0.10 | 31,654 | 2 months ago |
22.0.10-beta.1 | 67 | 2 months ago |
22.0.9 | 2,523 | 2 months ago |
21.3.1 | 186,087 | 3 months ago |
21.2.12 | 15,259 | 3 months ago |
21.2.8 | 14,718 | 3 months ago |
21.2.1 | 192,877 | 4 months ago |
21.1.7 | 177,092 | 5 months ago |
21.1.3 | 270,165 | 6 months ago |
21.1.2 | 8,389 | 6 months ago |
21.1.1 | 4,821 | 6 months ago |
21.0.29 | 780,126 | 9 months ago |
21.0.26 | 120,775 | 10 months ago |
21.0.22 | 145,216 | 6/22/2024 |
21.0.2 | 739,672 | 3/17/2024 |
20.0.34 | 30,729 | 3/15/2024 |
20.0.28 | 42,897 | 3/9/2024 |
20.0.15 | 572,200 | 1/22/2024 |
20.0.4 | 313,771 | 12/5/2023 |
20.0.1 | 1,444 | 12/5/2023 |
19.2.91 | 184,428 | 12/5/2023 |
19.2.87 | 211,188 | 11/16/2023 |
19.2.69 | 556,863 | 8/29/2023 |
19.2.67 | 24,607 | 8/25/2023 |
19.2.66 | 1,458 | 8/25/2023 |
19.2.64 | 17,076 | 8/22/2023 |
19.2.63 | 1,685 | 8/22/2023 |
19.2.61 | 11,786 | 8/21/2023 |
19.2.51 | 108,350 | 7/31/2023 |
19.2.50 | 2,699 | 7/31/2023 |
19.2.29 | 568,148 | 5/17/2023 |
19.2.26 | 38,354 | 5/12/2023 |
19.2.25 | 1,609 | 5/12/2023 |
19.2.22 | 100,145 | 5/4/2023 |
19.2.18 | 78,558 | 4/24/2023 |
19.2.17 | 7,871 | 4/23/2023 |
19.2.16 | 18,698 | 4/19/2023 |
19.2.15 | 8,426 | 4/18/2023 |
19.2.13 | 1,645 | 4/18/2023 |
19.2.12 | 4,518 | 4/18/2023 |
19.2.11 | 29,816 | 4/13/2023 |
19.2.9 | 31,529 | 4/11/2023 |
19.2.8 | 2,547 | 4/11/2023 |
19.2.4 | 250,001 | 3/13/2023 |
19.2.1 | 93,617 | 3/2/2023 |
19.1.18 | 164,688 | 2/14/2023 |
19.1.14 | 64,426 | 1/31/2023 |
19.1.13 | 109,180 | 1/24/2023 |
19.1.5 | 239,350 | 12/19/2022 |
19.1.1 | 40,729 | 12/13/2022 |
19.0.1 | 58,596 | 12/8/2022 |
18.0.1 | 80,975 | 11/28/2022 |