单元测试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
没有理由不测试该代码。这是重构该代码的原因。
修改它,以便它可以从提供的 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);
}
当然,您也可以在单元测试中提供一个文本文件,如果这比代码中的字符串更易于维护的话。
我有一个函数,它只是逐行读取文件并为输出做一些逻辑。
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
没有理由不测试该代码。这是重构该代码的原因。
修改它,以便它可以从提供的 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);
}
当然,您也可以在单元测试中提供一个文本文件,如果这比代码中的字符串更易于维护的话。