System.IO.Abstractions.TestingHelpers 22.0.14

System.IO.Abstractions NuGet Build Quality Gate Status Coverage Renovate enabled FOSSA Status

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);
        }
    }
}

Showing the top 20 packages that depend on System.IO.Abstractions.TestingHelpers.

Packages Downloads
Glob.cs
File system path globbing library (wildcards like in bash).
41
Glob.cs
File system path globbing library (wildcards like in bash).
40
Glob.cs
File system path globbing library (wildcards like in bash).
39
Glob.cs
File system path globbing library (wildcards like in bash).
22
Glob.cs
File system path globbing library (wildcards like in bash).
21

Version Downloads Last updated
22.0.14 11 04/20/2025
22.0.13 11 04/06/2025
22.0.12 19 03/14/2025
22.0.11 16 03/02/2025
22.0.10 20 02/23/2025
22.0.10-beta.1 18 02/23/2025
22.0.9 21 02/22/2025
21.3.1 20 01/31/2025
21.2.12 20 01/29/2025
21.2.8 18 01/28/2025
21.2.1 18 12/30/2024
21.1.7 27 12/05/2024
21.1.3 26 11/09/2024
21.1.2 22 11/08/2024
21.1.1 23 11/08/2024
21.0.29 29 07/26/2024
21.0.26 29 07/14/2024
21.0.22 34 07/04/2024
21.0.2 30 03/20/2024
20.0.34 32 03/18/2024
20.0.28 32 03/11/2024
20.0.15 31 02/01/2024
20.0.4 30 01/17/2024
20.0.1 42 02/20/2024
19.2.91 31 02/25/2024
19.2.87 28 02/06/2024
19.2.69 29 02/09/2024
19.2.67 30 02/14/2024
19.2.66 28 02/17/2024
19.2.64 31 01/21/2024
19.2.63 33 01/24/2024
19.2.61 29 02/10/2024
19.2.51 31 02/05/2024
19.2.50 27 02/15/2024
19.2.29 30 02/13/2024
19.2.26 27 02/05/2024
19.2.25 29 02/10/2024
19.2.22 33 02/24/2024
19.2.18 31 01/30/2024
19.2.17 32 02/12/2024
19.2.16 31 01/28/2024
19.2.15 30 02/24/2024
19.2.13 30 01/26/2024
19.2.12 30 01/23/2024
19.2.11 29 02/05/2024
19.2.9 31 01/22/2024
19.2.8 33 01/27/2024
19.2.4 30 01/23/2024
19.2.1 29 02/12/2024
19.1.18 33 02/07/2024
19.1.14 33 02/07/2024
19.1.13 31 02/10/2024
19.1.5 32 02/25/2024
19.1.1 28 02/23/2024
19.0.1 32 02/05/2024
18.0.1 29 01/26/2024
17.2.26 41 02/15/2024
17.2.3 31 02/23/2024
17.2.1 29 02/23/2024
17.1.1 31 02/07/2024
17.0.28 29 02/16/2024
17.0.24 31 02/10/2024
17.0.23 33 02/03/2024
17.0.21 30 02/24/2024
17.0.18 31 02/02/2024
17.0.15 29 02/24/2024
17.0.14 30 01/21/2024
17.0.13 28 01/31/2024
17.0.12 32 02/08/2024
17.0.11 30 02/03/2024
17.0.10 33 01/31/2024
17.0.9 26 02/13/2024
17.0.8 32 02/23/2024
17.0.7 32 02/22/2024
17.0.6 31 02/23/2024
17.0.5 35 02/23/2024
17.0.4 31 02/23/2024
17.0.3 30 02/14/2024
17.0.2 28 02/23/2024
17.0.1 31 02/23/2024
16.1.26 31 02/24/2024
16.1.25 30 02/12/2024
16.1.24 31 02/21/2024
16.1.23 27 02/03/2024
16.1.22 31 01/27/2024
16.1.21 35 02/22/2024
16.1.20 33 02/05/2024
16.1.19 31 02/25/2024
16.1.18 32 02/01/2024
16.1.17 35 01/25/2024
16.1.16 33 02/25/2024
16.1.15 29 02/02/2024
16.1.14 34 01/28/2024
16.1.13 34 01/30/2024
16.1.12 31 01/20/2024
16.1.11 30 02/03/2024
16.1.10 33 02/05/2024
16.1.9 31 02/23/2024
16.1.8 31 01/30/2024
16.1.7 30 02/07/2024
16.1.6 34 01/30/2024
16.1.5 35 02/02/2024
16.1.4 28 02/10/2024
16.1.2 30 01/31/2024
16.1.1 35 02/08/2024
16.0.8 31 01/25/2024
16.0.7 31 02/01/2024
16.0.6 31 01/27/2024
16.0.5 28 01/30/2024
16.0.4 31 02/13/2024
16.0.3 34 02/02/2024
16.0.2 36 02/05/2024
16.0.1 29 02/10/2024
15.0.1 29 02/19/2024
14.0.13 33 02/20/2024
14.0.12 31 02/05/2024
14.0.11 31 02/25/2024
14.0.10 33 02/25/2024
14.0.9 36 02/11/2024
14.0.8 34 02/18/2024
14.0.7 26 02/23/2024
14.0.6 29 02/23/2024
14.0.5 31 02/14/2024
14.0.4 34 01/23/2024
14.0.3 31 02/13/2024
14.0.2 28 01/28/2024
14.0.1 31 01/20/2024
13.2.47 29 02/25/2024
13.2.46 40 02/04/2024
13.2.45 32 02/13/2024
13.2.43 37 02/18/2024
13.2.42 32 01/22/2024
13.2.41 30 01/27/2024
13.2.40 30 02/11/2024
13.2.39 31 02/07/2024
13.2.38 32 02/25/2024
13.2.37 31 02/24/2024
13.2.36 30 02/04/2024
13.2.35 31 02/03/2024
13.2.34 29 02/25/2024
13.2.33 32 01/26/2024
13.2.32 29 01/31/2024
13.2.31 33 01/25/2024
13.2.30 34 02/21/2024
13.2.29 41 02/19/2024
13.2.28 30 02/25/2024
13.2.27 28 02/25/2024
13.2.25 28 01/28/2024
13.2.24 30 02/25/2024
13.2.23 29 02/24/2024
13.2.22 32 02/22/2024
13.2.20 34 02/14/2024
13.2.19 33 01/20/2024
13.2.18 31 01/27/2024
13.2.17 34 02/04/2024
13.2.16 30 01/26/2024
13.2.15 32 02/02/2024
13.2.14 31 02/22/2024
13.2.13 26 02/09/2024
13.2.12 33 02/20/2024
13.2.11 30 01/22/2024
13.2.10 32 02/25/2024
13.2.9 37 01/31/2024
13.2.8 31 02/23/2024
13.2.7 38 02/06/2024
13.2.6 31 02/23/2024
13.2.5 32 01/27/2024
13.2.4 30 02/23/2024
13.2.3 32 01/27/2024
13.2.2 34 01/24/2024
13.2.1 31 01/30/2024
13.1.2 31 02/03/2024
13.1.1 28 01/28/2024
13.0.1 31 02/01/2024
12.2.27 33 02/12/2024
12.2.26 31 02/25/2024
12.2.25 33 02/25/2024
12.2.24 31 01/28/2024
12.2.23 32 01/28/2024
12.2.22 31 02/04/2024
12.2.21 33 01/20/2024
12.2.20 30 02/06/2024
12.2.19 34 02/05/2024
12.2.7 31 02/12/2024
12.2.6 36 02/20/2024
12.2.5 27 01/21/2024
12.2.4 32 01/24/2024
12.2.3 30 02/04/2024
12.2.2 43 02/01/2024
12.2.1 31 02/01/2024
12.1.11 33 01/23/2024
12.1.10 32 02/09/2024
12.1.9 35 01/30/2024
12.1.2 31 02/18/2024
12.1.1 30 02/23/2024
12.0.13 31 02/14/2024
12.0.10 29 02/24/2024
12.0.9 29 02/23/2024
12.0.5 30 02/23/2024
12.0.4 34 02/23/2024
12.0.3 37 02/16/2024
12.0.2 33 02/17/2024
12.0.1 39 02/23/2024
11.0.18 35 02/07/2024
11.0.17 34 02/24/2024
11.0.16 31 02/05/2024
11.0.15 33 02/19/2024
11.0.14 29 01/22/2024
11.0.13 31 01/25/2024
11.0.12 31 02/01/2024
11.0.7 31 02/23/2024
11.0.6 32 02/11/2024
11.0.5 31 02/23/2024
11.0.4 29 02/23/2024
11.0.3 31 02/23/2024
11.0.2 33 02/18/2024
11.0.1 32 01/27/2024
10.0.10 30 02/24/2024
10.0.9 34 02/23/2024
10.0.8 30 01/30/2024
10.0.7 38 01/31/2024
10.0.6 33 02/21/2024
10.0.5 31 02/23/2024
10.0.4 33 02/03/2024
10.0.1 33 02/13/2024
9.0.6 31 02/23/2024
9.0.5 33 01/22/2024
9.0.4 32 02/18/2024
9.0.3 29 02/23/2024
9.0.2 33 01/22/2024
9.0.1 30 02/23/2024
8.1.1 37 01/31/2024
8.0.6 30 02/23/2024
8.0.5 34 02/01/2024
8.0.4 32 02/23/2024
8.0.3 35 02/07/2024
7.1.10 29 01/29/2024
7.1.8 30 02/23/2024
7.1.4 30 02/23/2024
7.1.3 31 02/05/2024
7.1.1 32 01/23/2024
7.0.16 35 02/11/2024
7.0.15 34 01/26/2024
7.0.7 36 02/23/2024
7.0.5 38 01/26/2024
7.0.4 31 02/23/2024
6.0.38 36 02/01/2024
6.0.36 29 01/27/2024
6.0.34 31 02/02/2024
6.0.32 32 02/18/2024
6.0.27 32 02/01/2024
6.0.25 29 02/23/2024
6.0.23 32 02/23/2024
6.0.21 30 02/02/2024
6.0.19 29 02/02/2024
6.0.17 34 01/30/2024
6.0.15 30 02/03/2024
6.0.14 29 01/30/2024
6.0.13 27 01/24/2024
6.0.11 31 02/23/2024
6.0.9 38 02/08/2024
6.0.7 31 02/04/2024
6.0.6 30 02/02/2024
6.0.5 30 02/07/2024
6.0.3 30 02/06/2024
6.0.1 33 02/23/2024
5.0.1 34 02/15/2024
4.2.17 37 02/07/2024
4.2.15 31 02/08/2024
4.2.13 29 02/06/2024
4.2.12 33 01/26/2024
4.2.10 30 01/26/2024
4.2.9 31 02/22/2024
4.2.8 34 02/23/2024
4.2.4 40 01/29/2024
4.1.6 37 02/19/2024
4.0.11 30 02/23/2024
3.1.1 30 02/13/2024
3.0.10 34 02/12/2024
3.0.2 32 01/25/2024
2.2.18-beta 31 02/18/2024
2.2.17-beta 33 02/25/2024
2.2.16-beta 32 02/07/2024
2.2.15-beta 30 01/31/2024
2.2.14-beta 33 01/21/2024
2.2.13-beta 31 02/25/2024
2.2.12-beta 32 02/13/2024
2.2.11-beta 29 02/25/2024
2.2.10-beta 32 02/25/2024
2.2.9-beta 27 02/08/2024
2.2.8-beta 34 02/23/2024
2.2.7-beta 36 02/09/2024
2.2.6-beta 29 02/04/2024
2.2.5-beta 29 02/25/2024
2.2.4-beta 35 02/22/2024
2.2.3-beta 29 01/25/2024
2.2.2-beta 30 02/14/2024
2.1.0.256 32 02/22/2024
2.1.0.247 31 02/04/2024
2.1.0.237 27 02/25/2024
2.1.0.236 31 02/25/2024
2.1.0.235 27 02/24/2024
2.1.0.234 29 02/03/2024
2.1.0.233 29 02/10/2024
2.1.0.232 30 02/10/2024
2.1.0.231 32 02/24/2024
2.1.0.230 34 02/24/2024
2.1.0.229 30 02/25/2024
2.1.0.228 31 01/23/2024
2.1.0.227 34 02/25/2024
2.1.0.226 29 02/11/2024
2.1.0.217 29 02/25/2024
2.1.0.216 33 01/25/2024
2.1.0.215 26 02/24/2024
2.1.0.214 32 02/11/2024
2.1.0.213 32 02/02/2024
2.1.0.211 33 02/25/2024
2.1.0.210 31 02/16/2024
2.1.0.209 31 02/09/2024
2.1.0.208 33 02/10/2024
2.1.0.207 27 01/27/2024
2.1.0.206 34 01/26/2024
2.1.0.205 34 02/24/2024
2.1.0.204 29 01/23/2024
2.1.0.203 37 02/04/2024
2.1.0.202 36 02/10/2024
2.1.0.201 24 01/26/2024
2.1.0.200 30 02/01/2024
2.1.0.199 32 02/05/2024
2.1.0.198 29 02/10/2024
2.1.0.197 34 02/24/2024
2.1.0.196 29 02/05/2024
2.1.0.195 31 01/24/2024
2.1.0.194 38 02/16/2024
2.1.0.193 30 02/12/2024
2.1.0.192 32 02/05/2024
2.1.0.191 31 02/06/2024
2.1.0.190 32 02/15/2024
2.1.0.189 29 01/31/2024
2.1.0.188 30 02/25/2024
2.1.0.187 30 02/22/2024
2.1.0.186 30 02/11/2024
2.1.0.185 38 02/24/2024
2.1.0.184 33 02/11/2024
2.1.0.183 29 02/12/2024
2.1.0.182 29 02/24/2024
2.1.0.181 30 01/31/2024
2.1.0.180 37 01/20/2024
2.1.0.179 33 01/30/2024
2.1.0.178 31 02/24/2024
2.1.0.177 31 01/22/2024
2.1.0.176 36 02/24/2024
2.1.0.175 30 02/25/2024
2.1.0.174 35 02/25/2024
2.1.0.173 35 02/25/2024
2.1.0.172 28 02/03/2024
2.1.0.171 31 02/19/2024
2.1.0.170 29 01/25/2024
2.1.0.169 39 02/12/2024
2.1.0.168 33 02/25/2024
2.1.0.166 31 02/24/2024
2.1.0.164 30 02/02/2024
2.1.0.163 28 02/03/2024
2.1.0.159 30 02/25/2024
2.0.0.143 0 04/07/2017
2.0.0.142 0 04/07/2017
2.0.0.141 0 03/02/2017
2.0.0.140 0 01/17/2017
2.0.0.139 0 01/06/2017
2.0.0.138 0 11/17/2016
2.0.0.137 0 10/14/2016
2.0.0.136 0 10/01/2016
2.0.0.124 0 02/08/2016
2.0.0.123 0 12/29/2015
2.0.0.122 0 12/28/2015
2.0.0.121 0 12/28/2015
2.0.0.120 0 12/06/2015
2.0.0.119 0 12/06/2015
2.0.0.118 0 11/04/2015
2.0.0.117 0 10/19/2015
2.0.0.116 0 07/20/2015
2.0.0.115 0 05/18/2015
2.0.0.114 0 05/18/2015
2.0.0.113 0 03/18/2015
2.0.0.112 0 03/11/2015
2.0.0.111 0 03/11/2015
2.0.0.110 0 03/11/2015
2.0.0.109 0 03/11/2015
2.0.0.108 0 03/04/2015
2.0.0.107 0 02/23/2015
2.0.0.106 0 02/20/2015
2.0.0.105 0 02/19/2015
2.0.0.104 0 02/14/2015
2.0.0.103 0 02/07/2015
2.0.0.102 0 02/07/2015
2.0.0.101 0 01/25/2015
2.0.0.100 0 01/25/2015
2.0.0.99 0 01/25/2015
2.0.0.98 0 01/25/2015
1.4.0.93 0 01/25/2015
1.4.0.92 0 09/29/2014
1.4.0.89 0 09/29/2014
1.4.0.88 0 09/29/2014
1.4.0.87 0 09/21/2014
1.4.0.86 0 05/07/2014
1.4.0.85 0 04/23/2014
1.4.0.84 0 04/07/2014
1.4.0.83 0 03/24/2014
1.4.0.82 0 03/24/2014
1.4.0.81 0 03/17/2014
1.4.0.80 0 03/17/2014
1.4.0.79 0 03/10/2014
1.4.0.78 0 03/02/2014
1.4.0.77 0 03/02/2014
1.4.0.76 0 02/21/2014
1.4.0.75 0 02/20/2014
1.4.0.74 0 01/12/2014
1.4.0.73 0 12/22/2013
1.4.0.72 0 12/01/2013
1.4.0.71 0 12/01/2013
1.4.0.70 0 11/21/2013
1.4.0.69 0 11/20/2013
1.4.0.68 0 10/15/2013
1.4.0.67 0 10/15/2013
1.4.0.66 0 07/31/2013
1.4.0.65 0 07/09/2013
1.4.0.64 0 04/26/2013
1.4.0.63 0 04/26/2013
1.4.0.62 0 04/26/2013
1.4.0.61 0 04/25/2013
1.4.0.60 0 04/25/2013
1.4.0.59 0 04/25/2013
1.4.0.58 0 04/25/2013
1.4.0.57 0 04/25/2013
1.4.0.56 0 04/25/2013
1.4.0.55 0 04/25/2013
1.4.0.54 0 04/25/2013
1.4.0.53 0 04/25/2013
1.4.0.52 0 04/25/2013
1.4.0.51 0 04/22/2013
1.4.0.50 0 04/22/2013
1.4.0.49 0 04/11/2013
1.4.0.48 0 03/24/2013
1.4.0.47 0 03/24/2013
1.4.0.46 0 03/24/2013
1.4.0.45 0 03/24/2013
1.4.0.44 0 03/16/2013
1.4.0.43 0 03/16/2013
1.4.0.42 0 03/16/2013
1.4.0.41 0 03/06/2013
1.4.0.40 0 12/24/2012
1.4.0.39 0 12/23/2012
1.4.0.38 0 12/23/2012
1.4.0.37 0 11/29/2012
1.4.0.36 0 11/29/2012
1.4.0.35 0 09/25/2012
1.4.0.32 0 07/14/2012
1.4.0.31 0 07/14/2012
1.4.0.30 0 07/12/2012
1.4.0.29 0 07/12/2012
1.4.0.28 0 07/12/2012
1.4.0.27 0 07/12/2012
1.4.0.26 0 07/02/2012
1.4.0.25 0 07/02/2012
1.4.0.24 0 05/15/2012
1.4.0.23 0 04/25/2012
1.4.0.22 0 04/25/2012
1.4.0.21 0 04/25/2012
1.4.0.20 0 04/18/2012
1.4.0.19 0 04/18/2012
1.4.0.18 0 04/18/2012
1.4.0.17 0 04/18/2012
1.4.0.14 0 04/04/2012
1.4.0.13 0 03/27/2012
1.4.0.12 0 09/16/2011
1.4.0.11 0 09/16/2011
1.3.0 30 01/27/2024
1.2.0 29 02/01/2024