我在這里提供了使用 Car 類從 SQL 資料庫中寫入、修改和洗掉記錄的代碼。代碼運行良好,但會產生警告。我如何獲取這段代碼及其各種功能并為這段特定的代碼實作單元測驗(特別是在 Mac 上的 VS Code 中)?代碼是用 C# 撰寫的,SQL 資料庫有 9 個不同的列,它們是 Car 類的屬性
using System;
using Xunit;
using System.Data;
using Microsoft.Data.Sqlite;
using System.Threading.Tasks;
namespace sqlite_app
{
public class Car{
public string _id;
public string _year;
public string _make;
public string _model;
public string _mileage;
public string _is_in_service;
public string _rental_rate;
public string _color;
public string _location;
public Car(string id, string year, string make, string model, string mileage, string is_in_service, string rental_rate, string color, string location){
_id=id;
_year=year;
_make=make;
_model=model;
_mileage=mileage;
_is_in_service=is_in_service;
_rental_rate=rental_rate;
_color=color;
_location=location;
}
public class car_record{
public static void Main(String[] args){
bool is_true=false;
string choice="0";
while(is_true==false){
System.Console.WriteLine("What would you like to do?");
System.Console.WriteLine("Enter the following numbers for each choice:");
System.Console.WriteLine("1. Enter a record");
System.Console.WriteLine("2. delete a record");
System.Console.WriteLine("3. modify a record");
choice = Console.ReadLine();
if(choice=="1"||choice =="2" ||choice=="3"){
is_true=true;
}
else{
Console.WriteLine("Not a valid choice. Enter 1, 2 or 3");
}
}
if(choice=="1"){
string id, year, make, model, mileage, is_in_service, rental_rate, color, location;
System.Console.WriteLine("Assign the car an id number");
id=Console.ReadLine();
System.Console.WriteLine("What is the car's year?");
year=Console.ReadLine();
System.Console.WriteLine("What is the make?");
make=Console.ReadLine();
System.Console.WriteLine("What is the model?");
model=Console.ReadLine();
System.Console.WriteLine("What is the current mileage");
mileage=Console.ReadLine();
System.Console.WriteLine("Is the car currently in service (type yes or no)?");
is_in_service=Console.ReadLine();
System.Console.WriteLine("What is the car's per day rental rate");
rental_rate=Console.ReadLine();
System.Console.WriteLine("What is the car's color");
color=Console.ReadLine();
System.Console.WriteLine("What location is the car at?");
location=Console.ReadLine();
Car car1 = new Car(id, year, make, model, mileage, is_in_service, rental_rate, color, location);
insertdata(car1);
}
if(choice=="2"){
string id_str;
System.Console.WriteLine("What is the record id?");
id_str=Console.ReadLine();
int flag =0;
deleteRecord(id_str,flag);
}
if(choice=="3"){
string id_string;
Console.WriteLine("What is the id of the record you would like to update?");
id_string=Console.ReadLine();
modifyRecord(id_string);
}
}
public static void insertdata(Car car1)
{
var connectionStringBuilder = new SqliteConnectionStringBuilder();
//Use DB in project directory. If it does not exist, create it:
connectionStringBuilder.DataSource = "carRecords.db";
using (var connection = new SqliteConnection(connectionStringBuilder.ConnectionString))
{
connection.Open();
//Create a table (drop if already exists first):
//Seed some data:
using (var transaction = connection.BeginTransaction())
{
var insertCmd = connection.CreateCommand();
insertCmd.CommandText = "INSERT INTO carRecords VALUES ('" car1._id "','" car1._year "','" car1._make "','" car1._model "','" car1._mileage "','" car1._is_in_service "','" car1._rental_rate "','" car1._color "','" car1._location "')";
insertCmd.ExecuteNonQuery();
transaction.Commit();
}
Console.WriteLine("Record Entered");
}
}
public static int deleteRecord(string id_num, int flag)
{
var connectionStringBuilder = new SqliteConnectionStringBuilder();
//Use DB in project directory. If it does not exist, create it:
connectionStringBuilder.DataSource = "carRecords.db";
using (var connection = new SqliteConnection(connectionStringBuilder.ConnectionString))
{
connection.Open();
//Create a table (drop if already exists first):
//Seed some data:
using (var transaction = connection.BeginTransaction())
{
var insertCmd = connection.CreateCommand();
insertCmd.CommandText = "DELETE FROM carRecords WHERE id=" id_num "";
insertCmd.ExecuteNonQuery();
transaction.Commit();
}
Console.WriteLine("Record Deleted");
flag=1;
return flag;
}
return flag;
}
private static void modifyRecord(string id_string)
{
string choose = "0";
bool iss_true=false;
while(iss_true==false){
System.Console.WriteLine("What would you like to do?");
System.Console.WriteLine("Enter the following numbers for each choice:");
System.Console.WriteLine("1. Update a car's mileage");
System.Console.WriteLine("2. Update a car's rental cost per day.");
System.Console.WriteLine("3. Whether a car is avaiable or not.");
System.Console.WriteLine("4. Update a car's location.");
choose = Console.ReadLine();
if(choose=="1"||choose =="2" ||choose=="3" || choose=="4"){
iss_true=true;
}
else{
Console.WriteLine("Not a valid choice. Enter 1, 2 or 3");
}
}
var connectionStringBuilder = new SqliteConnectionStringBuilder();
//Use DB in project directory. If it does not exist, create it:
connectionStringBuilder.DataSource = "carRecords.db";
if(choose=="1"){
Console.WriteLine("What is the new mileage");
string Mileage=Console.ReadLine();
using (var connection = new SqliteConnection(connectionStringBuilder.ConnectionString))
{
connection.Open();
//Create a table (drop if already exists first):
//Seed some data:
using (var transaction = connection.BeginTransaction())
{
var insertCmd = connection.CreateCommand();
insertCmd.CommandText = "UPDATE carRecords SET mileage=" Mileage " WHERE id =" id_string "";
insertCmd.ExecuteNonQuery();
transaction.Commit();
}
}
}
if(choose=="2"){
Console.WriteLine("What is the new cost for rental");
string Cost=Console.ReadLine();
using (var connection = new SqliteConnection(connectionStringBuilder.ConnectionString))
{
connection.Open();
//Create a table (drop if already exists first):
//Seed some data:
using (var transaction = connection.BeginTransaction())
{
var insertCmd = connection.CreateCommand();
insertCmd.CommandText = "UPDATE carRecords SET cost=" Cost " WHERE id =" id_string "";
insertCmd.ExecuteNonQuery();
transaction.Commit();
}
}
}
if(choose=="3"){
Console.WriteLine("is the car avaiable yes or no");
string is_in_service=Console.ReadLine();
using (var connection = new SqliteConnection(connectionStringBuilder.ConnectionString))
{
connection.Open();
//Create a table (drop if already exists first):
//Seed some data:
using (var transaction = connection.BeginTransaction())
{
var insertCmd = connection.CreateCommand();
insertCmd.CommandText = "UPDATE carRecords SET avaiable='" is_in_service "' WHERE id ='" id_string "'";
insertCmd.ExecuteNonQuery();
transaction.Commit();
}
}
}
if(choose=="4"){
Console.WriteLine("Enter the new location of the car");
string location=Console.ReadLine();
using (var connection = new SqliteConnection(connectionStringBuilder.ConnectionString))
{
connection.Open();
//Create a table (drop if already exists first):
//Seed some data:
using (var transaction = connection.BeginTransaction())
{
var insertCmd = connection.CreateCommand();
insertCmd.CommandText = "UPDATE carRecords SET location='" location "' WHERE id ='" id_string "'";
insertCmd.ExecuteNonQuery();
transaction.Commit();
}
}
}
Console.WriteLine("Record Updated");
}
}
}
}
uj5u.com熱心網友回復:
有兩種主要的設計選擇使您的代碼不容易進行單元測驗:
您正在從命令列獲取所有輸入。為了使其可進行單元測驗,您可以將每個“選擇”的邏輯移動到單獨的函式中,為每個函式獨立添加單元測驗,并添加一個“處理程式”方法,該方法將“選擇”作為輸入并路由到適當的功能(并為該處理程式添加測驗)。
您正在直接連接到資料庫。撰寫影響外部資源的單元測驗很困難。執行此操作的常用方法是“模擬”資料庫(有各種框架可以執行此操作)并向模擬添加方法以驗證您在單元測驗中所做的更改是否被保留。這不是一個簡單的程序,因為您需要將應用程式與資料庫分離并構建模擬以驗證更改。
最后,我假設這是一個“學習”專案,但我建議您養成使用 SQL 引數而不是連接字串的習慣。連接字串會使您面臨 SQL 注入攻擊和其他漏洞(轉義字串值等)。現在養成這種習慣將使您成為更好的軟體工程師。
uj5u.com熱心網友回復:
您正在尋找的不是單元測驗,而是稱為“集成測驗”。因為它作用于多個“單元”(特別是因為涉及到一個資料庫,這可能會導致測驗失敗,原因與您正在測驗的代碼無關。
您可以進行單元測驗并模擬資料庫連接(通過依賴注入和介面之類的東西),或者進行集成測驗。
無論哪種方式,向您的解決方案添加一個新專案并選擇“NUnit 測驗專案”模板。參考您要測驗的專案并撰寫測驗用例。
有關如何實作此目標的示例,請參閱https://docs.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-nunit(創建第一個測驗)。
如果您轉到 Visual Studio 工具列中的“測驗”并選擇“分析所有測驗的代碼覆寫率”,它將顯示您錯過的代碼中的路徑。請注意,此概述并不是您必須測驗的所有內容的黃金法則。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/372176.html
上一篇:如何將多個內容寫入文本檔案
下一篇:NUnitCustomAttribute始終將TestName顯示為AdHockTestMethod。我該如何解決?
