前言
前兩篇完成了 Claude Code CLI 及 Claude Code Desktop 的安裝, 這篇開始實際使用. 範例專案採用筆者之前的文章: 非決定性元素 (Non-Deterministic Elements) 的單元測試, 以亂數 (Random) 為例 (GitHub Repository), 在 Claude Code Desktop 中透過四段對話, 走一遍「讀取分析 → 診斷問題 → 修改檔案 → 驗證 → 版控提交」的流程. 整理如下, 供備忘之用.
一. 選擇模型及推理強度
開新 session 前, 可以先選擇模型及推理強度 (Effort):
- 模型: 預設為 Opus 5.5.
- 推理強度: Low ~ Max. 強度越高, 回應越完整, 但耗時與用量也越多. 本例選 High.

二. 選擇本機資料夾
點選輸入框下方的 [Choose...]:

選擇範例專案的資料夾:

確認路徑後, 按 [Trust workspace]:

資料夾已帶入輸入框下方, 可以開始對話:

三. 對話 1: 分析目前專案
請幫我看一下這個專案,用中文說明它是做什麼的、主要的資料夾結構、以及用到哪些技術。
Claude 的分析結果整理如下.
這個專案在做什麼
這是一個 ASP.NET Core 6 MVC 的教學範例, 主題是: 程式裡用到「非決定性元素」(例如 Random) 時, 要怎麼寫單元測試.
它用一個簡單的「樂透開獎」功能來示範:
- 進入
/Lotto頁面時, 系統會從 0~9 抽一個亂數 (Next(0, 10), 包含 0, 不包含 10). - 數字個位數是 9 就顯示「恭喜中獎」, 其他數字顯示「再接再厲」.
問題在於 System.Random 沒有實作任何介面, 每次輸出又不一樣, 測試沒辦法穩定驗證結果. 專案的解法是:
- 自己定義
IRandomGenerator介面, 再寫RandomGenerator把Random包起來 (Wrapper 模式). LottoService透過建構式注入 (DI) 取得IRandomGenerator, 不直接new Random().- 測試時用 Moq 做一個假的
IRandomGenerator, 固定回傳 9 或 1, 這樣就能穩定驗證「中獎」和「沒中」兩種結果.
另外, README.md 是這次練習的完整教學文章, README.html 則是轉成可以貼到 Google Blogger 的版本.
主要資料夾結構
20240118_ASPNetCore6Random/
├─ ASPNetCore6Random.sln 方案檔
├─ ASPNetCore6Random/ 主要的 Web 專案 (MVC)
│ ├─ Program.cs 啟動設定、DI 註冊、路由
│ ├─ Controllers/
│ │ ├─ HomeController.cs 範本預設的首頁
│ │ └─ LottoController.cs 樂透開獎,呼叫 LottoService
│ ├─ Services/
│ │ ├─ ILottoService.cs
│ │ └─ LottoService.cs 開獎邏輯(判斷是否中獎)
│ ├─ Wrapper/
│ │ ├─ IRandomGenerator.cs 包裝 Random 的介面
│ │ └─ RandomGenerator.cs 實作,裡面呼叫 System.Random
│ ├─ ViewModels/LottoViewModel.cs YourNumber + Message
│ ├─ Models/ErrorViewModel.cs
│ ├─ Views/ Razor 頁面(Lotto/Index、Shared/_Layout 等)
│ └─ wwwroot/ 靜態檔(css、js、Bootstrap/jQuery 函式庫)
├─ ASPNetCore6RandomTests/ 單元測試專案
│ └─ Services/LottoServiceTests.cs 兩個測試:回傳 9 會中獎、回傳 1 不會中
├─ pictures/ README 用的截圖(中獎、沒中、測試結果)
├─ README.md / README.html 教學文件
DI 註冊寫在 Program.cs: IRandomGenerator 註冊成 Singleton, ILottoService 註冊成 Scoped.
用到的技術
| 類別 | 技術 |
|---|---|
| 平台 | .NET 6 (net6.0), C# (有開 Nullable, ImplicitUsings) |
| Web 框架 | ASP.NET Core 6 MVC, Razor Views |
| 前端 | Bootstrap, jQuery, jQuery Validation (範本內建) |
| 設計模式 | 依賴注入 (DI), 介面抽象, Wrapper 包裝非決定性元素 |
| 測試框架 | MSTest 3.0.4 |
| 模擬工具 | Moq 4.18.4 (產生假的 IRandomGenerator) |
| 物件比對 | ExpectedObjects 3.5.4 (直接比對整個 ViewModel) |
| 覆蓋率 | coverlet.collector 6.0.0 |
| 開發工具 | Visual Studio 2022 |
小提醒
Claude 額外發現: Program.cs 裡 #region 那行的中文註解顯示成亂碼, 檔案很可能是用 Big5 存的, 不是 UTF-8. 程式照樣能跑, 但改存成 UTF-8, 才能讓 GitHub 和其他編輯器正常顯示. 這個問題留到 五. 處理.
四. 對話 2: 移除 GitHub 遠端
接下來會修改程式, 但這次只想在本地端練習, 所以先請 Claude 把 GitHub 的遠端移除, 以免不小心 push 回去.
請先幫我將 github 的遠端連結先移除, 以免不小心 push 回 github. 也就是這次只在本地端作處理.
處理結果:
- 移除的是
origin, 網址為https://github.com/jasper-lai/20240118_ASPNetCore6Random.git. git remote -v現在是空的,master也不再追蹤origin/master.- 本地的 commit 歷史和檔案都沒有變動, 最新一筆仍是
aef083b.
現在就算執行 git push, Git 也只會報錯說沒有設定推送目的地, 不會推到 GitHub.
日後如果要重新連回 GitHub, 執行以下兩行即可恢復:
git remote add origin https://github.com/jasper-lai/20240118_ASPNetCore6Random.git
git branch --set-upstream-to=origin/master master
注意: 第二行要先執行 git fetch origin, 抓回遠端分支之後才能執行.
五. 對話 3: 處理 Program.cs 的中文編碼問題
請進行 Program.cs 中文編碼問題的處理
原因: Program.cs 是用 Big5 存的, 而專案裡其他 .cs 檔大多是 UTF-8 (含 BOM), 所以第 9 行的中文註解在多數編輯器裡會變成亂碼. (註: 實際檢查, Models/ErrorViewModel.cs 是不含 BOM 的純 ASCII 檔案, 內容不受影響.)
處理: 把 Big5 內容轉成 UTF-8 (含 BOM), 換行一樣是 CRLF. 現在第 9 行可以正常顯示:
#region 註冊相關的服務
git diff 只有兩處變動: 第 1 行多了 BOM, 第 9 行的中文改成正確的編碼, 程式碼本身沒變. Claude 也檢查過專案裡所有的程式及設定檔, 只有 Program.cs 不是 UTF-8.
驗證:
dotnet build成功. 只有一個NETSDK1138警告, 意思是 net6.0 已停止支援, 跟這次修改無關.dotnet test兩個測試都通過. 不過這台電腦只裝了 .NET 10, 沒有 .NET 6 執行環境, 直接執行測試會中止, 所以 Claude 加了DOTNET_ROLL_FORWARD=Major, 讓測試改用 .NET 10 執行. 專案設定沒有改.
六. 對話 4: commit 編碼修正 (只在本地)
請幫我 commit 這個編碼修正(只在本地)
編碼修正已 commit 在本地的 master 分支, 沒有 push 到任何地方:
- Commit:
afdfef7修正 Program.cs 中文編碼: 由 Big5 轉為 UTF-8 (BOM), 與其他檔案一致 - 內容: 只有
ASPNetCore6Random/Program.cs一個檔案. - 狀態: 工作區沒有其他未 commit 的修改. repo 沒有設定遠端, 所以這個 commit 不會被誤推到 GitHub.
在 Visual Studio 2026 觀察 Git 記錄, 最上方就是剛才的 commit:

結論
透過四段對話, 等於把 Claude Code 的核心循環全走過一遍: 讀取分析 → 診斷問題 → 修改檔案 → 驗證 → 版控提交.
過程中有幾點值得一提: 動手修改前, 先移除遠端, 確保所有修改只留在本地; 修改後執行 build 與 test, 並說明測試環境的差異 (本機沒有 .NET 6, 以 .NET 10 執行); 最後以中文 commit 訊息記錄, 可在 Visual Studio 2026 直接檢視.
沒有留言:
張貼留言