【发布时间】:2016-06-13 16:04:24
【问题描述】:
我知道这可能很容易,但是由于我刚刚开始学习单元测试,所以我对所有可能性都有些困惑。
我有一个非常简单的方法,它应该从文件中读取整数(条件是文件只包含整数,每个都存储在一个新行中)。
public static IEnumerable<int> ReadIntegers(string file)
{
using (var stream = File.OpenText(file))
{
string line;
while ((line = stream.ReadLine()) != null)
{
yield return int.Parse(line);
}
}
}
在我继续之前,请不要建议我重构方法,我已经找到了,我想学习如何为这个特定的输入参数和输出值编写单元测试。
我在另一个主题上发现有人建议在测试用例中创建一个测试文件,而不是尝试将预期结果与实际结果进行比较,如下所示:
[Test]
public void ShouldValidateReadingOfTheFile()
{
string path = @"E:\TestFile.txt";
using (var sw = File.AppendText(path))
{
sw.WriteLine(1);
sw.WriteLine(100);
}
var expected = new List<int>() { 1, 100 };
var actual = TestProject.Merge.ReadIntegersFromFile(path);
Assert.IsTrue(expected.SequenceEqual(actual));
}
我想问你这是一种不好的做法吗?你有不同的方法吗?对于这种方法的不同测试还有其他想法吗?谢谢!
【问题讨论】:
-
您表示您不想重构,但在同一情况下询问这是否是一种不好的做法以及是否有不同的方法。您可以抽象服务后面读取的 File 行,以便您可以模拟它以进行测试。并让实际实现从文件中获取数据。尝试像提供的建议那样分离您的方法的职责。它试图做的太多了。
-
始终避免来自单元测试的硬编码文件访问(最好完全避免它)。您可能在另一台机器上没有 F 盘。有些甚至没有 C 盘或没有剩余空间。 Luiso 的内存流是一个很好的解决方案。当它确实需要成为一个文件时,您也可以不惜任何代价使用部署项。使用模拟将是另一种解决方案。
标签: c# unit-testing nunit