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

如何为C#操作SQLite汽车记录的代码在Mac版VS Code中编写单元测试

C# SQLite 车辆记录操作单元测试实现方案

前置环境配置(Mac VS Code 环境)

  • 首先安装对应版本的 .NET SDK,VS Code 安装 C# Dev Kit 扩展,确保基础C#开发环境可用
  • 在你的项目目录终端执行以下命令安装依赖包:
dotnet add package Microsoft.Data.Sqlite
dotnet add package xunit
dotnet add package xunit.runner.visualstudio
dotnet add package Microsoft.NET.Test.Sdk

原有代码优化(消除警告+适配单元测试)

原有代码存在几个问题需要先调整:

  1. 公开字段不符合C#规范会触发警告,把Car类的_id等公开字段改成公共属性
  2. 数据库操作硬编码本地库路径,且存在SQL注入风险,统一改成参数化查询,支持传入连接字符串,方便单元测试用内存SQLite,不污染本地生产库
  3. modifyRecord方法混合了用户交互和数据库操作,且是私有方法,需要拆分:把交互逻辑留在Main方法里,把修改数据库的逻辑抽成独立公共方法,接收ID、修改字段类型、新值三个参数
  4. 可以把建表逻辑补充上,避免首次运行找不到表的报错

单元测试代码实现

我们使用内存SQLite做测试数据库,每次测试启动自动建表,测试结束自动销毁,不会影响本地的真实数据:

using Xunit;
using Microsoft.Data.Sqlite;
using sqlite_app;
using System;

namespace sqlite_app.Tests
{
    public class CarRecordTests : IDisposable
    {
        private readonly SqliteConnection _testConnection;
        private readonly string _testConnString = "DataSource=:memory:";

        public CarRecordTests()
        {
            // 初始化内存数据库,建表
            _testConnection = new SqliteConnection(_testConnString);
            _testConnection.Open();
            var createTableCmd = _testConnection.CreateCommand();
            createTableCmd.CommandText = @"
                CREATE TABLE carRecords (
                    id TEXT PRIMARY KEY,
                    year TEXT,
                    make TEXT,
                    model TEXT,
                    mileage TEXT,
                    is_in_service TEXT,
                    rental_rate TEXT,
                    color TEXT,
                    location TEXT
                )";
            createTableCmd.ExecuteNonQuery();
        }

        public void Dispose()
        {
            // 测试结束销毁内存数据库
            _testConnection.Close();
            _testConnection.Dispose();
        }

        [Fact]
        public void InsertData_ValidCar_RecordInsertedSuccessfully()
        {
            // 准备测试数据
            var testCar = new Car("1", "2020", "丰田", "卡罗拉", "50000", "yes", "200", "白色", "北京");
            
            // 执行插入
            Car.car_record.insertdata(testCar, _testConnString);

            // 验证插入结果
            var checkCmd = _testConnection.CreateCommand();
            checkCmd.CommandText = "SELECT COUNT(*) FROM carRecords WHERE id = '1'";
            var count = Convert.ToInt32(checkCmd.ExecuteScalar());
            Assert.Equal(1, count);
        }

        [Fact]
        public void DeleteRecord_ExistId_RecordDeletedSuccessfully()
        {
            // 先插入测试数据
            var testCar = new Car("2", "2021", "本田", "思域", "30000", "yes", "220", "黑色", "上海");
            Car.car_record.insertdata(testCar, _testConnString);

            // 执行删除
            var result = Car.car_record.deleteRecord("2", 0, _testConnString);

            // 验证删除结果
            var checkCmd = _testConnection.CreateCommand();
            checkCmd.CommandText = "SELECT COUNT(*) FROM carRecords WHERE id = '2'";
            var count = Convert.ToInt32(checkCmd.ExecuteScalar());
            Assert.Equal(1, result);
            Assert.Equal(0, count);
        }

        [Fact]
        public void UpdateMileage_ExistId_ValueUpdatedSuccessfully()
        {
            // 先插入测试数据
            var testCar = new Car("3", "2019", "大众", "朗逸", "80000", "yes", "180", "银色", "广州");
            Car.car_record.insertdata(testCar, _testConnString);

            // 执行修改里程
            Car.car_record.UpdateMileage("3", "90000", _testConnString);

            // 验证修改结果
            var checkCmd = _testConnection.CreateCommand();
            checkCmd.CommandText = "SELECT mileage FROM carRecords WHERE id = '3'";
            var newMileage = checkCmd.ExecuteScalar().ToString();
            Assert.Equal("90000", newMileage);
        }

        // 其他修改场景(租金、在库状态、位置)的测试逻辑和上面一致,依次补充即可
    }
}

注:上面测试代码调用的insertdata、deleteRecord、UpdateMileage都是你优化后支持传入连接字符串的重载方法,只需要在原有方法基础上增加连接字符串参数即可,不需要修改原有业务逻辑。

运行测试

  • 在VS Code的测试资源管理器面板可以直接点击运行所有测试,查看测试结果
  • 也可以在项目目录终端执行命令dotnet test,终端会输出所有测试的运行结果

内容的提问来源于stack exchange,提问作者Connor Rogan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:54:03