c# - 单元测试与集成测试
问题描述
我有一个函数,它只是逐行读取文件并为输出执行一些逻辑。
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;
}
该函数的整个关键是从流中逐行读取,那么为它编写单元测试是否有意义?我应该只用测试文件编写集成测试吗?就个人而言,我觉得我不应该编写单元测试,因为该方法完全依赖于外部文件。请为此场景提出最佳实践。
解决方案
就个人而言,我觉得我不应该编写单元测试,因为该方法完全依赖于外部文件
这不是不测试该代码的理由。这是重构该代码的原因。
修改它,使其可以从提供的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);
}
你当然也可以为你的单元测试提供一个文本文件,如果它比代码中的字符串更易于维护的话。
推荐阅读
- php - 未定义属性:Illuminate\Pagination\LengthAwarePaginator::$id(查看:C:\xampp\htdocs\medipro55\resources\views\admin\division\index.blade.php)
- ruby - 如何使用“方法”而不是代码块来创建光纤
- facebook - 如何在 Facebook 即时游戏中删除统一内置加载屏幕?
- django - 如何使用邮递员发送嵌套的表单数据?
- javascript - 带有可选参数的javascript构造函数
- c# - 如何使用此代码添加现有的字符串数组值?
- ibm-cloud - Cloudant 仪表板未在 IBM Cloud 中启动
- python - Python 锁定鼠标和键盘
- javascript - Node js Form-data 作为中间件
- c# - 需要使用 C# 中的代码从另一个应用程序以最小化模式打开 Windows 窗体应用程序