如何为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
原有代码优化(消除警告+适配单元测试)
原有代码存在几个问题需要先调整:
- 公开字段不符合C#规范会触发警告,把Car类的
_id等公开字段改成公共属性 - 数据库操作硬编码本地库路径,且存在SQL注入风险,统一改成参数化查询,支持传入连接字符串,方便单元测试用内存SQLite,不污染本地生产库
modifyRecord方法混合了用户交互和数据库操作,且是私有方法,需要拆分:把交互逻辑留在Main方法里,把修改数据库的逻辑抽成独立公共方法,接收ID、修改字段类型、新值三个参数- 可以把建表逻辑补充上,避免首次运行找不到表的报错
单元测试代码实现
我们使用内存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
相关产品推荐
相关产品推荐

