首页 > 解决方案 > 单元测试与集成测试

问题描述

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

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

该函数的整个关键是从流中逐行读取,那么为它编写单元测试是否有意义?我应该只用测试文件编写集成测试吗?就个人而言,我觉得我不应该编写单元测试,因为该方法完全依赖于外部文件。请为此场景提出最佳实践。

标签: c#unit-testingtestingintegration-testing

解决方案


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

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

修改它,使其可以从提供的TextReader(从中StreamReader继承)中读取:

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

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


推荐阅读