单元测试v/s集成测试

Unit test v/s Integration test

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

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;
}

函数的全部关键是从流中逐行读取,那么为它编写单元测试是否有意义?我应该只用测试文件编写集成测试吗?我个人觉得我不应该写单元测试,因为该方法完全依赖于外部文件。请针对这种情况提出最佳做法。

Personally, I feel that I should not be writing a unit test because the method is totally dependant on an external file

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

修改它,以便它可以从提供的 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);
}

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