Comprehensive guide to integrating AutoFixture with Bogus. Use when you need to combine AutoFixture and Bogus to produce test data that is both anonymous and realistic. Covers ISpecimenBuilder integration, hybrid generators, test data factories, and handling circular references. Keywords: autofixture bogus integration, autofixture bogus, bogus integration, Faker, EmailSpecimenBuilder, PhoneSpecimenBuilder, NameSpecimenBuilder, realistic test data, semantic data, hybrid generator, HybridTestDataGenerator, OmitOnRecursionBehavior, circular references
| 面向 | AutoFixture | Bogus | 整合方案 | | -------------- | ------------------------ | ------------------------ | ---------------- | | 資料真實感 | 低(GUID 格式字串) | 高(真實 Email/Phone) | 高 | | 物件關聯處理 | 自動 | 手動 | 自動 | | 循環參考處理 | 內建 | 無 | 整合 | | 設定複雜度 | 低 | 中 | 中 | | 適用場景 | 單元測試 | 整合測試/原型 | 兩者皆可 |
整合效果: user.Email 從 "Email1a2b3c4d" 變為 "john.doe@example.com",其他屬性仍由 AutoFixture 自動填充。
<PackageReference Include="AutoFixture" Version="4.18.1" />
<PackageReference Include="AutoFixture.Xunit2" Version="4.18.1" />
<PackageReference Include="Bogus" Version="35.6.5" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="AwesomeAssertions" Version="9.4.0" />
| 整合方式 | 適用場景 | 複雜度 | | ---------------------------- | ------------------ | ------ | | 屬性層級 SpecimenBuilder | 特定屬性使用 Bogus | 低 | | 類型層級 SpecimenBuilder | 整個類型使用 Bogus | 中 | | 混合產生器 (HybridGenerator) | 統一 API 整合 | 中 | | 整合工廠 (IntegratedFactory) | 完整測試場景建構 | 高 | | 自訂 AutoData 屬性 | xUnit 整合 | 低 |
透過 ISpecimenBuilder 介面實現屬性層級與類型層級的整合:
Email、Phone、FirstName),使用 Bogus 產生對應的真實感資料User、Address)註冊 Bogus Faker 產生器| SpecimenBuilder | 產生資料類型 | Bogus API |
| ------------------------ | ------------------ | ------------------------ |
| EmailSpecimenBuilder | Email 地址 | f.Internet.Email() |
| PhoneSpecimenBuilder | 電話號碼 | f.Phone.PhoneNumber() |
| NameSpecimenBuilder | 人名 | f.Name.FirstName() |
| AddressSpecimenBuilder | 地址 | f.Address.FullAddress()|
fixture.WithBogus() — 註冊所有 Bogus SpecimenBuilderfixture.WithOmitOnRecursion() — 處理循環參考fixture.WithSeed(seed) — 設定隨機種子fixture.WithRepeatCount(count) — 設定 CreateMany 預設數量當物件存在循環參考(如 User → Company → Employees(User))時,使用 OmitOnRecursionBehavior 解決:
var fixture = new Fixture();
fixture.Behaviors.OfType<ThrowingRecursionBehavior>()
.ToList()
.ForEach(b => fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(new OmitOnRecursionBehavior());
效果: 避免 StackOverflowException,循環參考的屬性設為 null 或空集合。
public class BogusAutoDataAttribute : AutoDataAttribute
{
public BogusAutoDataAttribute()
: base(() => new Fixture().WithBogus())
{
}
}
// 使用方式
[Theory]
[BogusAutoData]
public void 使用整合資料測試(User user, Address address)
{
user.Email.Should().Contain("@");
address.City.Should().NotBeNullOrEmpty();
}
統一的測試資料產生 API,實作 ITestDataGenerator 介面:
Generate<T>() — 產生單一物件Generate<T>(int count) — 產生指定數量的集合Generate<T>(Action<T> configure) — 產生物件後進行自訂設定完整場景建構工廠,支援進階功能:
CreateFresh<T>() — 每次產生全新物件CreateMany<T>(count) — 批次建立GetCached<T>() — 快取機制,相同類型只產生一次CreateTestScenario() — 建立包含 Company、Users、Orders 的完整測試場景,自動建立關聯統一 Fixture、Generator、Factory 的初始化與 Seed 管理,提供 Create<T>()、CreateMany<T>()、Create<T>(configure) 等便捷方法。
完整程式碼範例請參考 references/hybrid-generator-and-factory.md
由於 AutoFixture 和 Bogus 有不同的隨機數管理機制:
IntegratedTestDataFactory(seed: 12345) 確保穩定性Faker<User>().UseSeed(12345)AutoFixture 按照 Customizations 集合的順序匹配,先加入的 Builder 優先。使用 fixture.Customizations.Insert(0, builder) 可確保最高優先。
ISpecimenBuilder 實作Create() 方法中判斷屬性名稱或類型WithBogus() 擴充方法中註冊fixture.WithOmitOnRecursion().WithBogus()ISpecimenBuilder 實作類別檔案(如 EmailSpecimenBuilder.cs)FixtureBogusExtensions.cs)BogusAutoDataAttribute 供 xUnit Theory 測試使用OmitOnRecursionBehavior 處理循環參考npx skills add kevintsengtw/dotnet-testing-autofixture-bogus-integration下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer