Skip to content

Commit 3575c21

Browse files
committed
Merge branch 'wexman-master'
2 parents 15c3118 + 980a57a commit 3575c21

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+739
-151
lines changed

README.md

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ and/or:
1313

1414
Install-Package System.IO.Abstractions.TestingHelpers
1515

16-
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.
16+
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.
1717

1818
```csharp
1919
public class MyComponent
@@ -28,7 +28,7 @@ public class MyComponent
2828
/// <summary>Create MyComponent</summary>
2929
public MyComponent() : this(
3030
fileSystem: new FileSystem() //use default implementation which calls System.IO
31-
)
31+
)
3232
{
3333
}
3434

@@ -74,17 +74,67 @@ public void MyComponent_Validate_ShouldThrowNotSupportedExceptionIfTestingIsNotA
7474
Assert.Fail("The expected exception was not thrown.");
7575
}
7676
```
77+
7778
We even support casting from the .NET Framework's untestable types to our testable wrappers:
7879

7980
```csharp
80-
FileInfo SomeBadApiMethodThatReturnsFileInfo()
81+
FileInfo SomeApiMethodThatReturnsFileInfo()
8182
{
8283
return new FileInfo("a");
8384
}
8485

8586
void MyFancyMethod()
8687
{
87-
var testableFileInfo = (FileInfoBase)SomeBadApiMethodThatReturnsFileInfo();
88+
var testableFileInfo = (FileInfoBase)SomeApiMethodThatReturnsFileInfo();
8889
...
8990
}
9091
```
92+
93+
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](https://github.com/moq/moq4):
94+
95+
```csharp
96+
[Test]
97+
public void Test1()
98+
{
99+
var watcher = Mock.Of<IFileSystemWatcher>();
100+
var file = Mock.Of<IFile>();
101+
102+
Mock.Get(file).Setup(f => f.Exists(It.IsAny<string>())).Returns(true);
103+
Mock.Get(file).Setup(f => f.ReadAllText(It.IsAny<string>())).Throws<OutOfMemoryException>();
104+
105+
var unitUnderTest = new SomeClassUsingFileSystemWatcher(watcher, file);
106+
107+
Assert.Throws<OutOfMemoryException>(() => {
108+
Mock.Get(watcher).Raise(w => w.Created += null, new System.IO.FileSystemEventArgs(System.IO.WatcherChangeTypes.Created, @"C:\Some\Directory", "Some.File"));
109+
});
110+
111+
Mock.Get(file).Verify(f => f.Exists(It.IsAny<string>()), Times.Once);
112+
113+
Assert.True(unitUnderTest.FileWasCreated);
114+
}
115+
116+
public class SomeClassUsingFileSystemWatcher
117+
{
118+
private readonly IFileSystemWatcher _watcher;
119+
private readonly IFile _file;
120+
121+
public bool FileWasCreated { get; private set; }
122+
123+
public SomeClassUsingFileSystemWatcher(IFileSystemWatcher watcher, IFile file)
124+
{
125+
this._file = file;
126+
this._watcher = watcher;
127+
this._watcher.Created += Watcher_Created;
128+
}
129+
130+
private void Watcher_Created(object sender, System.IO.FileSystemEventArgs e)
131+
{
132+
FileWasCreated = true;
133+
134+
if(_file.Exists(e.FullPath))
135+
{
136+
var text = _file.ReadAllText(e.FullPath);
137+
}
138+
}
139+
}
140+
```

System.IO.Abstractions.TestingHelpers.Tests/MockDirectoryArgumentPathTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ namespace System.IO.Abstractions.TestingHelpers.Tests
66
{
77
public class MockDirectoryArgumentPathTests
88
{
9-
private static IEnumerable<Action<DirectoryBase>> GetFileSystemActionsForArgumentNullException()
9+
private static IEnumerable<Action<IDirectory>> GetFileSystemActionsForArgumentNullException()
1010
{
1111
yield return ds => ds.Delete(null);
1212
yield return ds => ds.Delete(null, true);
@@ -26,7 +26,7 @@ private static IEnumerable<Action<DirectoryBase>> GetFileSystemActionsForArgumen
2626
}
2727

2828
[TestCaseSource("GetFileSystemActionsForArgumentNullException")]
29-
public void Operations_ShouldThrowArgumentNullExceptionIfPathIsNull(Action<DirectoryBase> action)
29+
public void Operations_ShouldThrowArgumentNullExceptionIfPathIsNull(Action<IDirectory> action)
3030
{
3131
// Arrange
3232
var fileSystem = new MockFileSystem();

System.IO.Abstractions.TestingHelpers.Tests/MockFileArgumentPathTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace System.IO.Abstractions.TestingHelpers.Tests
77
{
88
public class MockFileArgumentPathTests
99
{
10-
private static IEnumerable<Action<FileBase>> GetFileSystemActionsForArgumentNullException()
10+
private static IEnumerable<Action<IFile>> GetFileSystemActionsForArgumentNullException()
1111
{
1212
yield return fs => fs.AppendAllLines(null, new[] { "does not matter" });
1313
yield return fs => fs.AppendAllLines(null, new[] { "does not matter" }, Encoding.ASCII);
@@ -57,7 +57,7 @@ private static IEnumerable<Action<FileBase>> GetFileSystemActionsForArgumentNull
5757
}
5858

5959
[TestCaseSource("GetFileSystemActionsForArgumentNullException")]
60-
public void Operations_ShouldThrowArgumentNullExceptionIfPathIsNull(Action<FileBase> action)
60+
public void Operations_ShouldThrowArgumentNullExceptionIfPathIsNull(Action<IFile> action)
6161
{
6262
// Arrange
6363
var fileSystem = new MockFileSystem();

System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,8 @@ public void MockFileSystem_FileSystemWatcher_ShouldBeAssignable()
352352

353353
private class TestFileSystemWatcherFactory : IFileSystemWatcherFactory
354354
{
355-
public FileSystemWatcherBase CreateNew() => new TestFileSystemWatcher(null);
356-
public FileSystemWatcherBase FromPath(string path) => new TestFileSystemWatcher(path);
355+
public IFileSystemWatcher CreateNew() => new TestFileSystemWatcher(null);
356+
public IFileSystemWatcher FromPath(string path) => new TestFileSystemWatcher(path);
357357
}
358358

359359
private class TestFileSystemWatcher : FileSystemWatcherBase

System.IO.Abstractions.TestingHelpers/IMockFileDataAccessor.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ public interface IMockFileDataAccessor
5656

5757
StringOperations StringOperations { get; }
5858

59-
FileBase File { get; }
60-
DirectoryBase Directory { get; }
59+
IFile File { get; }
60+
IDirectory Directory { get; }
6161
IFileInfoFactory FileInfo {get; }
62-
PathBase Path { get; }
62+
IPath Path { get; }
6363
IDirectoryInfoFactory DirectoryInfo { get; }
6464
IDriveInfoFactory DriveInfo { get; }
6565

System.IO.Abstractions.TestingHelpers/MockDirectory.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,19 @@ public MockDirectory(IMockFileDataAccessor mockFileDataAccessor, string currentD
2525
this.mockFileDataAccessor = mockFileDataAccessor ?? throw new ArgumentNullException(nameof(mockFileDataAccessor));
2626
}
2727

28-
public override DirectoryInfoBase CreateDirectory(string path)
28+
public override IDirectoryInfo CreateDirectory(string path)
2929
{
3030
return CreateDirectoryInternal(path, null);
3131
}
3232

3333
#if NET40
34-
public override DirectoryInfoBase CreateDirectory(string path, DirectorySecurity directorySecurity)
34+
public override IDirectoryInfo CreateDirectory(string path, DirectorySecurity directorySecurity)
3535
{
3636
return CreateDirectoryInternal(path, directorySecurity);
3737
}
3838
#endif
3939

40-
private DirectoryInfoBase CreateDirectoryInternal(string path, DirectorySecurity directorySecurity)
40+
private IDirectoryInfo CreateDirectoryInternal(string path, DirectorySecurity directorySecurity)
4141
{
4242
if (path == null)
4343
{
@@ -312,7 +312,7 @@ public override string[] GetLogicalDrives()
312312
}
313313
#endif
314314

315-
public override DirectoryInfoBase GetParent(string path)
315+
public override IDirectoryInfo GetParent(string path)
316316
{
317317
if (path == null)
318318
{

System.IO.Abstractions.TestingHelpers/MockDirectoryInfo.cs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,13 @@ public override void Create(DirectorySecurity directorySecurity)
127127
}
128128
#endif
129129

130-
public override DirectoryInfoBase CreateSubdirectory(string path)
130+
public override IDirectoryInfo CreateSubdirectory(string path)
131131
{
132132
return mockFileDataAccessor.Directory.CreateDirectory(Path.Combine(FullName, path));
133133
}
134134

135135
#if NET40
136-
public override DirectoryInfoBase CreateSubdirectory(string path, DirectorySecurity directorySecurity)
136+
public override IDirectoryInfo CreateSubdirectory(string path, DirectorySecurity directorySecurity)
137137
{
138138
return mockFileDataAccessor.Directory.CreateDirectory(Path.Combine(FullName, path), directorySecurity);
139139
}
@@ -144,47 +144,47 @@ public override void Delete(bool recursive)
144144
mockFileDataAccessor.Directory.Delete(directoryPath, recursive);
145145
}
146146

147-
public override IEnumerable<DirectoryInfoBase> EnumerateDirectories()
147+
public override IEnumerable<IDirectoryInfo> EnumerateDirectories()
148148
{
149149
return GetDirectories();
150150
}
151151

152-
public override IEnumerable<DirectoryInfoBase> EnumerateDirectories(string searchPattern)
152+
public override IEnumerable<IDirectoryInfo> EnumerateDirectories(string searchPattern)
153153
{
154154
return GetDirectories(searchPattern);
155155
}
156156

157-
public override IEnumerable<DirectoryInfoBase> EnumerateDirectories(string searchPattern, SearchOption searchOption)
157+
public override IEnumerable<IDirectoryInfo> EnumerateDirectories(string searchPattern, SearchOption searchOption)
158158
{
159159
return GetDirectories(searchPattern, searchOption);
160160
}
161161

162-
public override IEnumerable<FileInfoBase> EnumerateFiles()
162+
public override IEnumerable<IFileInfo> EnumerateFiles()
163163
{
164164
return GetFiles();
165165
}
166166

167-
public override IEnumerable<FileInfoBase> EnumerateFiles(string searchPattern)
167+
public override IEnumerable<IFileInfo> EnumerateFiles(string searchPattern)
168168
{
169169
return GetFiles(searchPattern);
170170
}
171171

172-
public override IEnumerable<FileInfoBase> EnumerateFiles(string searchPattern, SearchOption searchOption)
172+
public override IEnumerable<IFileInfo> EnumerateFiles(string searchPattern, SearchOption searchOption)
173173
{
174174
return GetFiles(searchPattern, searchOption);
175175
}
176176

177-
public override IEnumerable<FileSystemInfoBase> EnumerateFileSystemInfos()
177+
public override IEnumerable<IFileSystemInfo> EnumerateFileSystemInfos()
178178
{
179179
return GetFileSystemInfos();
180180
}
181181

182-
public override IEnumerable<FileSystemInfoBase> EnumerateFileSystemInfos(string searchPattern)
182+
public override IEnumerable<IFileSystemInfo> EnumerateFileSystemInfos(string searchPattern)
183183
{
184184
return GetFileSystemInfos(searchPattern);
185185
}
186186

187-
public override IEnumerable<FileSystemInfoBase> EnumerateFileSystemInfos(string searchPattern, SearchOption searchOption)
187+
public override IEnumerable<IFileSystemInfo> EnumerateFileSystemInfos(string searchPattern, SearchOption searchOption)
188188
{
189189
return GetFileSystemInfos(searchPattern, searchOption);
190190
}
@@ -199,17 +199,17 @@ public override DirectorySecurity GetAccessControl(AccessControlSections include
199199
return mockFileDataAccessor.Directory.GetAccessControl(directoryPath, includeSections);
200200
}
201201

202-
public override DirectoryInfoBase[] GetDirectories()
202+
public override IDirectoryInfo[] GetDirectories()
203203
{
204204
return ConvertStringsToDirectories(mockFileDataAccessor.Directory.GetDirectories(directoryPath));
205205
}
206206

207-
public override DirectoryInfoBase[] GetDirectories(string searchPattern)
207+
public override IDirectoryInfo[] GetDirectories(string searchPattern)
208208
{
209209
return ConvertStringsToDirectories(mockFileDataAccessor.Directory.GetDirectories(directoryPath, searchPattern));
210210
}
211211

212-
public override DirectoryInfoBase[] GetDirectories(string searchPattern, SearchOption searchOption)
212+
public override IDirectoryInfo[] GetDirectories(string searchPattern, SearchOption searchOption)
213213
{
214214
return ConvertStringsToDirectories(mockFileDataAccessor.Directory.GetDirectories(directoryPath, searchPattern, searchOption));
215215
}
@@ -222,41 +222,41 @@ private DirectoryInfoBase[] ConvertStringsToDirectories(IEnumerable<string> path
222222
.ToArray();
223223
}
224224

225-
public override FileInfoBase[] GetFiles()
225+
public override IFileInfo[] GetFiles()
226226
{
227227
return ConvertStringsToFiles(mockFileDataAccessor.Directory.GetFiles(FullName));
228228
}
229229

230-
public override FileInfoBase[] GetFiles(string searchPattern)
230+
public override IFileInfo[] GetFiles(string searchPattern)
231231
{
232232
return ConvertStringsToFiles(mockFileDataAccessor.Directory.GetFiles(FullName, searchPattern));
233233
}
234234

235-
public override FileInfoBase[] GetFiles(string searchPattern, SearchOption searchOption)
235+
public override IFileInfo[] GetFiles(string searchPattern, SearchOption searchOption)
236236
{
237237
return ConvertStringsToFiles(mockFileDataAccessor.Directory.GetFiles(FullName, searchPattern, searchOption));
238238
}
239239

240-
FileInfoBase[] ConvertStringsToFiles(IEnumerable<string> paths)
240+
IFileInfo[] ConvertStringsToFiles(IEnumerable<string> paths)
241241
{
242242
return paths
243243
.Select(mockFileDataAccessor.FileInfo.FromFileName)
244244
.ToArray();
245245
}
246246

247-
public override FileSystemInfoBase[] GetFileSystemInfos()
247+
public override IFileSystemInfo[] GetFileSystemInfos()
248248
{
249249
return GetFileSystemInfos("*");
250250
}
251251

252-
public override FileSystemInfoBase[] GetFileSystemInfos(string searchPattern)
252+
public override IFileSystemInfo[] GetFileSystemInfos(string searchPattern)
253253
{
254254
return GetFileSystemInfos(searchPattern, SearchOption.TopDirectoryOnly);
255255
}
256256

257-
public override FileSystemInfoBase[] GetFileSystemInfos(string searchPattern, SearchOption searchOption)
257+
public override IFileSystemInfo[] GetFileSystemInfos(string searchPattern, SearchOption searchOption)
258258
{
259-
return GetDirectories(searchPattern, searchOption).OfType<FileSystemInfoBase>().Concat(GetFiles(searchPattern, searchOption)).ToArray();
259+
return GetDirectories(searchPattern, searchOption).OfType<IFileSystemInfo>().Concat(GetFiles(searchPattern, searchOption)).ToArray();
260260
}
261261

262262
public override void MoveTo(string destDirName)
@@ -269,15 +269,15 @@ public override void SetAccessControl(DirectorySecurity directorySecurity)
269269
mockFileDataAccessor.Directory.SetAccessControl(directoryPath, directorySecurity);
270270
}
271271

272-
public override DirectoryInfoBase Parent
272+
public override IDirectoryInfo Parent
273273
{
274274
get
275275
{
276276
return mockFileDataAccessor.Directory.GetParent(directoryPath);
277277
}
278278
}
279279

280-
public override DirectoryInfoBase Root
280+
public override IDirectoryInfo Root
281281
{
282282
get
283283
{

System.IO.Abstractions.TestingHelpers/MockDirectoryInfoFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public MockDirectoryInfoFactory(IMockFileDataAccessor mockFileSystem)
1010
this.mockFileSystem = mockFileSystem;
1111
}
1212

13-
public DirectoryInfoBase FromDirectoryName(string directoryName)
13+
public IDirectoryInfo FromDirectoryName(string directoryName)
1414
{
1515
return new MockDirectoryInfo(mockFileSystem, directoryName);
1616
}

System.IO.Abstractions.TestingHelpers/MockDriveInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public MockDriveInfo(IMockFileDataAccessor mockFileDataAccessor, string name) :
4444
public new bool IsReady { get; protected set; }
4545
public override string Name { get; protected set; }
4646

47-
public override DirectoryInfoBase RootDirectory
47+
public override IDirectoryInfo RootDirectory
4848
{
4949
get
5050
{

System.IO.Abstractions.TestingHelpers/MockDriveInfoFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public MockDriveInfoFactory(IMockFileDataAccessor mockFileSystem)
1212
this.mockFileSystem = mockFileSystem ?? throw new ArgumentNullException(nameof(mockFileSystem));
1313
}
1414

15-
public DriveInfoBase[] GetDrives()
15+
public IDriveInfo[] GetDrives()
1616
{
1717
var driveLetters = new HashSet<string>(new DriveEqualityComparer(mockFileSystem));
1818
foreach (var path in mockFileSystem.AllPaths)
@@ -38,7 +38,7 @@ public DriveInfoBase[] GetDrives()
3838
return result.ToArray();
3939
}
4040

41-
public DriveInfoBase FromDriveName(string driveName)
41+
public IDriveInfo FromDriveName(string driveName)
4242
{
4343
var drive = mockFileSystem.Path.GetPathRoot(driveName);
4444

0 commit comments

Comments
 (0)