🐛 v2.4.2 修正 AwesomeAssertions 幻覺 API 名稱
本次修正 3 個 Skills、8 處錯誤的斷言方法名稱。
⚠️ 這些名稱在 AwesomeAssertions 中並不存在。 複製受影響範本的使用者會直接遇到CS1061編譯錯誤。建議所有使用者更新。
🔍 為什麼會發生
這三個名稱是 FluentAssertions 5.x 時代的舊式命名。AwesomeAssertions 承接的是 FluentAssertions 7 的 API,只保留 ...ThanOrEqualTo 形式 —— 舊名少了中間的 Than:
| 錯誤名稱(不存在) | 正確名稱 |
|---|---|
BeGreaterOrEqualTo(n) |
BeGreaterThanOrEqualTo(n) |
BeLessOrEqualTo(n) |
BeLessThanOrEqualTo(n) |
HaveCountGreaterOrEqualTo(n) |
HaveCountGreaterThanOrEqualTo(n) |
這類錯誤特別難以察覺 —— 名稱本身讀起來完全合理,語意也正確,只是那個版本的 API 從來沒有這樣命名過。它不會在文件審閱時被抓到,只會在使用者實際編譯時才爆出來。
🔬 查證方式
本次不是憑記憶或語感判斷:
- 以組件反射列舉 AwesomeAssertions 9.5.0 的 636 個公開成員名稱建立比對基準
- 抽出全部 Skills 中含
.Should()的敘述,逐一與成員集合比對 - 一併反射確認 AwesomeAssertions.Web 的 54 個狀態碼斷言(
Be200Ok、Be201Created、Be404NotFound等)全部存在,並非誤用 - 確認各 Skill 自訂的擴充方法(
ExcludingAuditFields、BeValidProduct等)定義皆存在於同一 Skill 的 templates 內
📋 受影響的 Skills
| Skill | 處數 | 檔案 |
|---|---|---|
dotnet-testing-autodata-xunit-integration |
5 | references/collection-size-attribute.md、templates/advanced-patterns.cs(2 處)、templates/external-data-integration.cs、templates/autodata-attributes.cs |
dotnet-testing-autofixture-customization |
1 | templates/dataannotations-integration.cs |
dotnet-testing-bogus-fake-data |
2 | templates/basic-usage.cs、templates/advanced-patterns.cs |
修正皆為單純的名稱替換,語意與斷言行為完全不變,不影響任何既有的正確用法。Skill 名稱、數量(29 個)、目錄結構均未更動,升級無相容性風險。
⚠️ 已知問題(尚未修正)
dotnet-testing-awesome-assertions-guide 與 dotnet-testing-complex-object-comparison 另有同類的幻覺 API,本次未一併修正 —— 這兩個 Skill 正在進行 v3 全面重寫,屆時會整份取代。若您正在使用這兩個 Skill,請留意下列對應:
| 錯誤 | 正確 |
|---|---|
WithMaxRecursionDepth(n) |
AllowingInfiniteRecursion() |
ExcludingNestedObjects |
Excluding(x => x.Child) |
RespectingRuntimeTypes |
PreferringRuntimeMemberTypes() |
HaveLengthGreaterThan(n) |
text.Length.Should().BeGreaterThan(n) |
HaveLengthLessThanOrEqualTo(n) |
text.Length.Should().BeLessThanOrEqualTo(n) |
BePositiveInfinity() / BeNegativeInfinity() |
Should().Be(double.PositiveInfinity) / Be(double.NegativeInfinity) |
註:
WithoutRecursing()不是ExcludingNestedObjects()的替代品。實測確認其語意為「不再遞迴比較巢狀成員,改用該成員本身的相等性比較」,兩個內容相同但不同實例的巢狀物件加了它反而會失敗。要略過某個巢狀物件請用Excluding(x => x.Child)。
📎 其他
本版一併包含 v2.4.1 發佈後同步的 README 內容更新。
完整差異:v2.4.1...v2.4.2