主頁 > 移動端開發 > 我如何在C#中進行單元測驗

我如何在C#中進行單元測驗

2021-12-03 10:51:27 移動端開發

我在這里提供了使用 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熱心網友回復:

有兩種主要的設計選擇使您的代碼不容易進行單元測驗:

  1. 您正在從命令列獲取所有輸入。為了使其可進行單元測驗,您可以將每個“選擇”的邏輯移動到單獨的函式中,為每個函式獨立添加單元測驗,并添加一個“處理程式”方法,該方法將“選擇”作為輸入并路由到適當的功能(并為該處理程式添加測驗)。

  2. 您正在直接連接到資料庫。撰寫影響外部資源的單元測驗很困難。執行此操作的常用方法是“模擬”資料庫(有各種框架可以執行此操作)并向模擬添加方法以驗證您在單元測驗中所做的更改是否被保留。這不是一個簡單的程序,因為您需要將應用程式與資料庫分離并構建模擬以驗證更改。

最后,我假設這是一個“學習”專案,但我建議您養成使用 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

標籤:C# 单元测试

上一篇:如何將多個內容寫入文本檔案

下一篇:NUnitCustomAttribute始終將TestName顯示為AdHockTestMethod。我該如何解決?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more