generate-unit-testlisted
Install: claude install-skill CloudyWing/ai-dotfiles
# 產生 NUnit 單元測試骨架
依 `csharp-nunit` skill 規範,為指定的 C# 類別或方法產生完整的測試骨架。
## 使用方式
```
/generate-unit-test [類別名稱或 .cs 檔案路徑]
```
若未傳入參數,詢問使用者要測試哪個類別。
## 執行步驟
### 1. 讀取目標類別
讀取指定的 `.cs` 檔案,識別:
- 類別名稱與命名空間
- 建構函式參數(確認需要 Mock 的相依性)
- 所有 `public` 方法(包含方法簽名、參數類型、回傳類型)
- 是否有 `async` 方法
- 是否有 `IDisposable`
### 2. 確認測試專案位置
掃描以下位置,找到對應的測試專案:
- `*.Tests/*.csproj`
- `tests/**/*.csproj`
- `[ProjectName].Tests/`
若找不到,詢問使用者測試專案路徑;若不存在,告知需先建立測試專案。
確認測試專案有引用以下 NuGet 套件:
- `NUnit`
- `NUnit3TestAdapter`
- `NSubstitute`
- `Microsoft.NET.Test.Sdk`
### 3. 產生測試類別骨架
依照以下規範產生:
```csharp
using NSubstitute;
using NUnit.Framework;
namespace [對應的測試命名空間];
[TestFixture]
public class [ClassName]Tests
{
private [ClassName] sut;
private [IDependency1] dependency1;
// ... 其餘相依性
[SetUp]
public void SetUp()
{
dependency1 = Substitute.For<[IDependency1]>();
// ... 建立其餘 Mock
sut = new [ClassName](dependency1);
}
[Test]
public void [MethodName]_[Scenario]_[ExpectedBehavior]()
{
// Arrange
// TODO: 設定輸入與 Mock 行為
// Act
var result = sut.[MethodName]();
// Assert
Assert.That(result, Is.Not.Null);
}
// 非同步方法範本
[Test]
public async Task [AsyncMethodName]_[Scenario]_[ExpectedBehavior]()
{
// Arrange
// Act
var result = await sut.[AsyncMethodName]();
// Assert
}
}
```
**命名規則:**
- 測試方法名稱:`[方法名稱]_[情境]_[預期結果]`(底線分隔三段式)。
- 測試類別名稱:`[被測試類別名稱]Te