单元测试与集成测试

时间:2019-05-03 09:11:49

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

我有一个函数,它仅逐行读取文件并为输出做一些逻辑。

internal List<string> GetDataToTranslate(string filePath)
{
    List<string> dataToTranslate = new List<string>();

    using (StreamReader fileReader = new StreamReader(new FileStream(filePath, FileMode.Open, FileAccess.Read), Encoding.GetEncoding("ISO-8859-1")))
    {
        string line, finalLine;
        StringBuilder sb = new StringBuilder();
        bool multiLineComment = false;

        while ((line = fileReader.ReadLine()) != null)
        {
            line = line.Trim();
            if (line.StartsWith("'"))
            {
                if (!multiLineComment)
                {
                    multiLineComment = true;
                }
                sb.Append(line.Substring(1) + DELIMITER);
            }
            else
            {
                if (multiLineComment)
                {
                    finalLine = sb.ToString();
                    dataToTranslate.Add(finalLine.Substring(0, finalLine.Length - DELIMITER.Length));
                    sb = sb.Clear();
                }
                multiLineComment = false;
            }
        }
    }
    return dataToTranslate;
}

该函数的整个症结在于从流中逐行读取,因此为其编写单元测试甚至有意义吗?我应该只用测试文件编写集成测试吗?我个人认为我不应该编写单元测试,因为该方法完全依赖于外部文件。请针对这种情况提出最佳做法。

1 个答案:

答案 0 :(得分:2)

  

我个人认为我不应该编写单元测试,因为该方法完全依赖于外部文件

没有理由不测试该代码。这是重构该代码的原因。

对其进行修改,以便可以从提供的TextReaderStreamReader继承)中读取:

internal List<string> GetDataToTranslate(string filePath)
{
    using (StreamReader fileReader = new StreamReader(...))
    {
        return GetDataToTranslate(fileReader);
    }
}

internal List<string> GetDataToTranslate(TextReader reader)
{
    List<string> dataToTranslate = new List<string>();

    // ... your code

    return dataToTranslate;    
}

然后从您的单元测试中,传递一个对包含测试数据的准备好的字符串进行操作的代码:

using (var reader = new StringReader("some-test-string"))
{
    var result = classUnderTest.GetDataToTranslate(reader);
}

如果比代码中的字符串更易于维护,您当然也可以在单元测试中提供一个文本文件。