单元测试调用CSV新增行方法无效,主程序运行正常问题排查
我编写了向CSV文件添加新行的AddToCvs方法,主程序调用时可正常为CSV文件新增行,但在单元测试的TestAddToCsv方法中调用对应方法时,无法完成新行添加操作。尝试过修改方法访问权限、创建使用公共变量的同名方法,问题仍未解决。
程序方法代码
public void AddToCvs(Estate estate) { try { if (estate is Apartment apartment) { string line = apartment.address + "," + apartment.cap + "," + apartment.city + "," + apartment.aream2 + "," + apartment.id + "," + apartment.numRoom + "," + apartment.numBath; File.AppendAllLines(apartmentFilePath, new string[] { line }); } else if (estate is House house) { string line = house.address + "," + house.cap + "," + house.city + "," + house.aream2 + "," + house.id + "," + house.numRoom + "," + house.numBath + "," + house.gardenm2; File.AppendAllLines(houseFilePath, new string[] { line }); } else if (estate is Box box) { string line = box.address + "," + box.cap + "," + box.city + "," + box.aream2 + "," + box.id + "," + box.numParkingSpace; File.AppendAllLines(boxFilePath, new string[] { line }); } } catch (Exception ex) { Console.WriteLine(ex.Message); } }
单元测试代码
public void TestAddToCsv() { string address = "Via Catania"; string cap = "54896"; string city = "Milano"; int aream2 = 200; string id = "A8"; int numRoom = 8; int numBath = 2; string mainApartmentPath = @"C:/Users/FMF-guest/.../bin/Debug/net6.0/ApartmentCsv.csv"; string testApartmentPath = @"C:/Users/FMF-guest/.../AgenziaImmobiliareTest/ApartmentCsv.csv"; var lineTest = "Via Catania,54896,Milano,200,A8,8,2"; Apartment newApartment = new Apartment(address, cap, city, aream2, id, numRoom, numBath); DataFiles data = new DataFiles(); data.TestAddToCsv(newApartment); File.AppendAllLines(testApartmentPath, new string[] { lineTest }); var result = File.ReadAllText(mainApartmentPath); var expectedResult = File.ReadAllText(testApartmentPath); Assert.AreEqual(expectedResult, result); }
问题排查与解决建议
1. 检查文件路径一致性
DataFiles类中apartmentFilePath的硬编码路径,可能和单元测试里mainApartmentPath指定的路径不一致——主程序运行时使用Debug目录下的文件,而测试时TestAddToCsv可能写入到了其他路径(比如测试项目的输出目录),导致你读取的文件根本没有被修改。
解决:不要硬编码文件路径,改为通过参数传递路径,或者在DataFiles类中提供设置路径的方法,让单元测试可以指定到mainApartmentPath:
// 修改DataFiles类,支持设置路径 public class DataFiles { public string ApartmentFilePath { get; set; } = "默认路径"; // 其他类型文件路径同理 public void AddToCvs(Estate estate) { try { if (estate is Apartment apartment) { string line = $"{apartment.address},{apartment.cap},{apartment.city},{apartment.aream2},{apartment.id},{apartment.numRoom},{apartment.numBath}"; File.AppendAllLines(ApartmentFilePath, new string[] { line }); } // 其他类型处理逻辑... } catch (Exception ex) { throw; // 不要吞异常,让测试能捕获并显示错误信息 } } } // 单元测试中指定目标路径 data.ApartmentFilePath = mainApartmentPath; data.AddToCvs(newApartment);
2. 不要吞掉异常
原方法中catch块只把异常信息打印到控制台,单元测试不会显示控制台输出,导致你根本不知道写入时是否发生了错误(比如路径不存在、权限不足)。
解决:要么移除try-catch让异常直接抛出,要么在catch中重新抛出带说明的异常:
catch (Exception ex) { throw new InvalidOperationException("写入CSV文件失败", ex); }
这样单元测试会直接失败并显示具体异常信息,快速定位问题。
3. 验证TestAddToCsv方法的实现
你提到创建了同名方法TestAddToCsv,要确认这个方法的逻辑和主程序的AddToCvs完全一致——比如是否正确处理了Apartment类型,是否使用了正确的文件路径,有没有遗漏关键逻辑。
4. 测试前后的文件清理
测试开始前,清空mainApartmentPath对应的文件,避免之前的内容干扰断言结果;测试结束后可以选择恢复或删除测试文件,保证每次测试环境干净:
// 测试开始前清空目标文件 File.WriteAllText(mainApartmentPath, string.Empty);
内容的提问来源于stack exchange,提问作者Luigi Distefano

