单元测试依赖于StreamReader读取文件的方法

时间:2018-08-29 12:24:39

标签: c# unit-testing

我如何测试使用StreamReader读取文件的方法, 我不想每次运行测试时都在硬盘上创建文件, 我只需要sr.ReadToEnd();成为我期望的字符串

public class ConfigStore : IConfigStore
{
    public string ReadFile(string FileName)
    {
        string result;
        using(StreamReader sr=new StreamReader(FileName) )
        {
            result= sr.ReadToEnd();
        }

        //logic to be tested
        return result+1;
    }
}

和我的考试班

[TestClass]
public class UnitTest2
{
    [TestMethod]
    public void Shoud_Add_1_To_File_Content()
    {
        //arrange
        ConfigStore configStore = new ConfigStore();


        //act
        var returntype=configStore.ReadFile("config.json");

        //assert
        Assert.AreEqual ("test1",returntype);

    }
}

注意:代码仅用于测试目的,不是真实的业务案例。

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用System.IO.Abstractions库来使您的方法单元可测试。

您需要向FileSystem类添加属性ConfigStore

// Default file system uses .NET Framework's File class
public IFileSystem FileSystem { get; set; } = new FileSystem();

第二,您需要使用此文件系统而不是StreamReader或直接使用System.IO.File

public string ReadFile(string FileName)
{
    return FileSystem.File.ReadAllText();
}

然后,您需要实现伪造的IFileSystem并覆盖必要的方法,例如,在File.Create方法中,您可以将传递的文件名添加到集合中,或者什么也不做。

然后,最后一步是创建该虚假文件系统的实例,并将其分配给ConfigStore.FileSystem,以便将使用您提供的文件系统。