用于读取文件的集成测试

时间:2015-07-08 18:15:06

标签: c# unit-testing testing integration-testing

我想确保我的C#程序按预期读取文件。我该怎么测试呢?我假设我只是调用我的函数(访问文件系统)并查看文件存在时的输出以及何时不存在。我应该改为抽象文件系统吗?

我是否应该费心去测试(因为我基本上测试StreamReader.ReadLine是否有效)?

我的函数看起来像这样(filePath,filePath2,a和b是函数的参数)

try
{
    TextReader tr = new StreamReader(filePath);

    a = tr.ReadLine();
    b = tr.ReadLine();
    tr.Close();
}
catch (Exception ex)
{
    error = GetError(ex);
}
if (error != "") {
    File.WriteAllText(filePath2+"Error.txt", error);
}

1 个答案:

答案 0 :(得分:0)

两种最常见的方法:所有文件IO操作的外观(因此您可以模拟它)或重构代码,您只需要测试易于模拟Stream对象的片段。

第二种方法示例:将您的代码重构为处理获取流的片段和另一个实际读取数据的片段:

public class MyClass 
{
  .............
  string a;
  string b;
  public ReadTheData(Stream stream)
  {
    try
    {
        TextReader tr = new StreamReader(stream);

        a = tr.ReadLine();
        b = tr.ReadLine();
        tr.Close();
    }
    catch (Exception ex)
    {
        // awful practice... Don't eat all exceptions
        error = GetError(ex);
    }
    if (error != "") {
       // whatever log infrastructure you have, need to be mock-able for tests 
        Logger.Log(error);
    }
  }
}

现在,您可以通过传递填写的ReadTheData甚至模拟出的流来对单元测试MemoryStream方法进行无法访问文件系统。