Unit Testing File I/O

后端 未结 6 1777
故里飘歌
故里飘歌 2020-11-29 20:58

Reading through the existing unit testing related threads here on Stack Overflow, I couldn\'t find one with a clear answer about how to unit test file I/O operations. I have

6条回答
  •  死守一世寂寞
    2020-11-29 21:24

    I use the System.IO.Abstractions NuGet package.

    This web site has a nice example showing you how to use injection for testing. http://dontcodetired.com/blog/post/Unit-Testing-C-File-Access-Code-with-SystemIOAbstractions

    Here is a copy of the code copied from the web site.

    using System.IO;
    using System.IO.Abstractions;
    
    namespace ConsoleApp1
    {
        public class FileProcessorTestable
        {
            private readonly IFileSystem _fileSystem;
    
            public FileProcessorTestable() : this (new FileSystem()) {}
    
            public FileProcessorTestable(IFileSystem fileSystem)
            {
                _fileSystem = fileSystem;
            }
    
            public void ConvertFirstLineToUpper(string inputFilePath)
            {
                string outputFilePath = Path.ChangeExtension(inputFilePath, ".out.txt");
    
                using (StreamReader inputReader = _fileSystem.File.OpenText(inputFilePath))
                using (StreamWriter outputWriter = _fileSystem.File.CreateText(outputFilePath))
                {
                    bool isFirstLine = true;
    
                    while (!inputReader.EndOfStream)
                    {
                        string line = inputReader.ReadLine();
    
                        if (isFirstLine)
                        {
                            line = line.ToUpperInvariant();
                            isFirstLine = false;
                        }
    
                        outputWriter.WriteLine(line);
                    }
                }
            }
        }
    }
    
    
    
    
    
    using System.IO.Abstractions.TestingHelpers;
    using Xunit;
    
    namespace XUnitTestProject1
    {
        public class FileProcessorTestableShould
        {
            [Fact]
            public void ConvertFirstLine()
            {
                var mockFileSystem = new MockFileSystem();
    
                var mockInputFile = new MockFileData("line1\nline2\nline3");
    
                mockFileSystem.AddFile(@"C:\temp\in.txt", mockInputFile);
    
                var sut = new FileProcessorTestable(mockFileSystem);
                sut.ConvertFirstLineToUpper(@"C:\temp\in.txt");
    
                MockFileData mockOutputFile = mockFileSystem.GetFile(@"C:\temp\in.out.txt");
    
                string[] outputLines = mockOutputFile.TextContents.SplitLines();
    
                Assert.Equal("LINE1", outputLines[0]);
                Assert.Equal("line2", outputLines[1]);
                Assert.Equal("line3", outputLines[2]);
            }
        }
    }
    

提交回复
热议问题