单元测试或不单元测试这部分
本文关键字:单元测试 这部分 | 更新日期: 2023-09-27 18:04:30
我有一个CSV类和一个CSV解析器类,以及它们的单元测试。我想知道是否必须删除下面单元测试的一部分:
public class CSV{
public string[] columns GetColumns()
{
var columns = null;
if (!string.IsNullOrEmpty(this.textReader.ReadLine()))
{
var columns = this.csvParser.GetColumns(line);
}
return columns;
}
}
[Test]
public void GetColumns_ReturnsCorrectLine()
{
reader.Setup(r => r.ReadLine()).Returns("a'tb'tc");
//Act
var columns = csvReader.GetColumns();
//Assert
Assert.IsTrue(columns!=null);
Assert.AreEqual(3, columns.Length);
Assert.AreEqual("a", columns[0]);
Assert.AreEqual("b", columns[1]);
Assert.AreEqual("c", columns[2]);
}
问题1)必须删除断言列(a,b,c)的三行代码吗?
2)删除最后三个断言后,GetColumns_ReturnsCorrectLine
测试方法是否执行正确的单元测试
请注意,已经有代码对CSV解析器的GetColumns()
方法进行单元测试。GetColumns的功能是解析以制表符分隔的字符串并将其转换为列。
任何想法?
看起来您正在尝试测试CSV.GetColumns()。
GetColumns()有三个路径
1) textReader.ReadLine()返回null =>返回null
2) textReader.ReadLine()返回" =>返回null
testReader.ReadLine()返回!string.NullOrEmpty() =>返回CsvParser的输出。
三个测试应该是
TextReader返回null =>结果为null
TextReader返回" =>结果为null
TestReader返回=>结果是CsvParser的返回值。
CsvParser返回的值并不重要——正如你提到的,CsvParser正确地完成了它的工作是在其他地方测试的——我们只想说我们返回了解析器的输出。
public interface ITextReader {
string ReadLine();
}
public interface ICsvParser {
string[] GetColumns(string line);
}
public class CSV {
private readonly ITextReader textReader;
private readonly ICsvParser csvParser;
public CSV(ITextReader textReader, ICsvParser csvParser) {
this.textReader = textReader;
this.csvParser = csvParser;
}
public string[] GetColumns() {
string[] columns = null;
var line = this.textReader.ReadLine();
if (!string.IsNullOrEmpty(line)){
columns = this.csvParser.GetColumns(line);
}
return columns;
}
}
[TestClass]
public class CSVFixture {
private Mock<ITextReader> mockTextReader;
private Mock<ICsvParser> mockCsvParser;
private CSV csv;
private readonly static string [] Columns = new string[]{};
[TestInitialize]
public void Setup() {
mockTextReader = new Mock<ITextReader>();
mockCsvParser = new Mock<ICsvParser>();
csv = new CSV(mockTextReader.Object, mockCsvParser.Object);
}
[TestMethod]
public void NullLine() {
Execute(null);
}
[TestMethod]
public void EmptyLine() {
Execute("");
}
[TestMethod]
public void PopulatedLine() {
Execute("SomeLineValue", Columns);
}
private void Execute(string line, string[] expected = null) {
mockTextReader.Setup(mk => mk.ReadLine()).Returns(line);
mockCsvParser.Setup(mk => mk.GetColumns(line)).Returns(Columns);
var actual = csv.GetColumns();
Assert.AreEqual(actual, expected);
}
}
其他点:只要CsvParser只从这里调用,它只是移动代码,但你可能会改变CsvParser,以便如果输入为空或空它返回空。这意味着您不必在每次调用CsvParser时检查它。
这些值应该被检查,但不是像你这样。
对于NUnit,有CollectionAssert
:
CollectionAssert.AreEqual(new [] {"a", "b", "c"}, columns);
必须删除断言列(a,b,c)的三行代码吗?
tl;博士:没有
如果你想确保"a'tb'tc"的结果是["a","b","c"]而不是["b","a","c"],那么你应该把它们留在里面。前两行只检查它是否为空和长度,内容可以是任何内容。
请注意,已经有代码对CSV进行单元测试解析器的GetColumns()方法
那些测试是什么?如果没有看到它们,很难判断它们是否重叠。