TestableIO.System.IO.Abstractions.Wrappers 19.1.5
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.
dotnet add package TestableIO.System.IO.Abstractions
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.");
}
}
}
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.AreEqual("We can't go on together. It's not me, it's you.", ex.Message);
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();
...
}
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);
}
}
}
Showing the top 20 packages that depend on TestableIO.System.IO.Abstractions.Wrappers.
Packages | Downloads |
---|---|
System.IO.Abstractions
A set of abstractions to help make file system interactions testable.
|
39 |
System.IO.Abstractions
A set of abstractions to help make file system interactions testable.
|
38 |
System.IO.Abstractions
A set of abstractions to help make file system interactions testable.
|
37 |
TestableIO.System.IO.Abstractions.TestingHelpers
A set of pre-built mocks to help when testing file system interactions.
|
37 |
System.IO.Abstractions
A set of abstractions to help make file system interactions testable.
|
36 |
System.IO.Abstractions
A set of abstractions to help make file system interactions testable.
|
35 |
TestableIO.System.IO.Abstractions.TestingHelpers
A set of pre-built mocks to help when testing file system interactions.
|
35 |
System.IO.Abstractions
A set of abstractions to help make file system interactions testable.
|
34 |
.NET Framework 4.6.1
- TestableIO.System.IO.Abstractions (>= 19.1.5)
.NET 5.0
- TestableIO.System.IO.Abstractions (>= 19.1.5)
- System.IO.FileSystem.AccessControl (>= 5.0.0)
.NET 6.0
- TestableIO.System.IO.Abstractions (>= 19.1.5)
.NET 7.0
- TestableIO.System.IO.Abstractions (>= 19.1.5)
.NET Standard 2.0
- TestableIO.System.IO.Abstractions (>= 19.1.5)
- System.IO.FileSystem.AccessControl (>= 5.0.0)
.NET Standard 2.1
- TestableIO.System.IO.Abstractions (>= 19.1.5)
- System.IO.FileSystem.AccessControl (>= 5.0.0)
Version | Downloads | Last updated |
---|---|---|
22.0.14 | 4 | 04/20/2025 |
22.0.13 | 4 | 04/06/2025 |
22.0.12 | 8 | 03/15/2025 |
22.0.11 | 10 | 03/04/2025 |
22.0.10 | 9 | 02/25/2025 |
22.0.10-beta.1 | 9 | 02/25/2025 |
22.0.9 | 9 | 02/25/2025 |
21.3.1 | 7 | 02/01/2025 |
21.2.12 | 8 | 02/01/2025 |
21.2.8 | 7 | 02/01/2025 |
21.2.1 | 9 | 01/02/2025 |
21.1.7 | 15 | 12/13/2024 |
21.1.3 | 13 | 11/14/2024 |
21.1.2 | 16 | 11/15/2024 |
21.1.1 | 19 | 11/15/2024 |
21.0.29 | 27 | 07/28/2024 |
21.0.26 | 24 | 07/16/2024 |
21.0.22 | 29 | 06/27/2024 |
21.0.2 | 33 | 03/20/2024 |
20.0.34 | 29 | 03/23/2024 |
20.0.28 | 33 | 03/10/2024 |
20.0.15 | 33 | 02/28/2024 |
20.0.4 | 36 | 12/15/2023 |
20.0.1 | 28 | 12/21/2023 |
19.2.91 | 36 | 12/13/2023 |
19.2.87 | 36 | 11/23/2023 |
19.2.69 | 40 | 09/02/2023 |
19.2.67 | 41 | 09/02/2023 |
19.2.66 | 35 | 09/02/2023 |
19.2.64 | 39 | 09/02/2023 |
19.2.63 | 36 | 09/02/2023 |
19.2.61 | 37 | 09/02/2023 |
19.2.51 | 38 | 09/02/2023 |
19.2.50 | 33 | 09/02/2023 |
19.2.29 | 40 | 09/02/2023 |
19.2.26 | 31 | 09/02/2023 |
19.2.25 | 35 | 09/02/2023 |
19.2.22 | 32 | 09/02/2023 |
19.2.18 | 40 | 09/02/2023 |
19.2.17 | 38 | 09/02/2023 |
19.2.16 | 31 | 09/02/2023 |
19.2.15 | 35 | 09/02/2023 |
19.2.13 | 33 | 09/02/2023 |
19.2.12 | 33 | 09/02/2023 |
19.2.11 | 36 | 09/02/2023 |
19.2.9 | 37 | 09/02/2023 |
19.2.8 | 32 | 09/02/2023 |
19.2.4 | 41 | 09/02/2023 |
19.2.1 | 40 | 09/02/2023 |
19.1.18 | 35 | 09/02/2023 |
19.1.14 | 32 | 09/02/2023 |
19.1.13 | 30 | 09/02/2023 |
19.1.5 | 39 | 09/02/2023 |
19.1.1 | 32 | 09/02/2023 |
19.0.1 | 33 | 09/02/2023 |
18.0.1 | 33 | 09/02/2023 |
17.2.26 | 37 | 09/02/2023 |