我有一个函数,它仅逐行读取文件并为输出做一些逻辑。
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;
}
该函数的整个症结在于从流中逐行读取,因此为其编写单元测试甚至有意义吗?我应该只用测试文件编写集成测试吗?我个人认为我不应该编写单元测试,因为该方法完全依赖于外部文件。请针对这种情况提出最佳做法。
答案 0 :(得分:2)
我个人认为我不应该编写单元测试,因为该方法完全依赖于外部文件
没有理由不测试该代码。这是重构该代码的原因。
对其进行修改,以便可以从提供的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);
}
如果比代码中的字符串更易于维护,您当然也可以在单元测试中提供一个文本文件。