You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单元测试调用CSV新增行方法无效,主程序运行正常问题排查

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:01:44