[{"data":1,"prerenderedAt":1388},["ShallowReactive",2],{"docs-navigation":3,"api-catalog":188,"api-nav-empty":286,"docs:\u002Fdocs\u002Fadvanced\u002Fspecimen-builders-and-specifications":287,"docs:\u002Fdocs\u002Fadvanced\u002Fspecimen-builders-and-specifications-surround":1385},[4],{"title":5,"path":6,"stem":7,"children":8,"page":32},"Docs","\u002Fdocs","docs",[9,33,63,85,99,137,154],{"title":10,"badge":11,"icon":12,"path":13,"stem":14,"children":15,"page":32},"Get started",null,"i-lucide-rocket","\u002Fdocs\u002Fget-started","docs\u002F1.get-started",[16,20,24,28],{"title":17,"path":18,"stem":19,"badge":11},"Introduction","\u002Fdocs\u002Fget-started\u002Fintroduction","docs\u002F1.get-started\u002F1.introduction",{"title":21,"path":22,"stem":23,"badge":11},"Installation","\u002Fdocs\u002Fget-started\u002Finstallation","docs\u002F1.get-started\u002F2.installation",{"title":25,"path":26,"stem":27,"badge":11},"Your first test","\u002Fdocs\u002Fget-started\u002Ffirst-test","docs\u002F1.get-started\u002F3.first-test",{"title":29,"path":30,"stem":31,"badge":11},"Refactoring a test","\u002Fdocs\u002Fget-started\u002Frefactoring-a-test","docs\u002F1.get-started\u002F4.refactoring-a-test",false,{"title":34,"badge":11,"icon":35,"path":36,"stem":37,"children":38,"page":32},"Fundamentals","i-lucide-layers","\u002Fdocs\u002Ffundamentals","docs\u002F2.fundamentals",[39,43,47,51,55,59],{"title":40,"path":41,"stem":42,"badge":11},"Fixture and Create","\u002Fdocs\u002Ffundamentals\u002Ffixture-and-create","docs\u002F2.fundamentals\u002F1.fixture-and-create",{"title":44,"path":45,"stem":46,"badge":11},"Build DSL","\u002Fdocs\u002Ffundamentals\u002Fbuild-dsl","docs\u002F2.fundamentals\u002F2.build-dsl",{"title":48,"path":49,"stem":50,"badge":11},"Customizations","\u002Fdocs\u002Ffundamentals\u002Fcustomizations","docs\u002F2.fundamentals\u002F3.customizations",{"title":52,"path":53,"stem":54,"badge":11},"Specimen graphs","\u002Fdocs\u002Ffundamentals\u002Fspecimen-graphs","docs\u002F2.fundamentals\u002F4.specimen-graphs",{"title":56,"path":57,"stem":58,"badge":11},"Behaviors","\u002Fdocs\u002Ffundamentals\u002Fbehaviors","docs\u002F2.fundamentals\u002F5.behaviors",{"title":60,"path":61,"stem":62,"badge":11},"Customizations catalog","\u002Fdocs\u002Ffundamentals\u002Fcustomizations-catalog","docs\u002F2.fundamentals\u002F6.customizations-catalog",{"title":64,"badge":11,"icon":65,"path":66,"stem":67,"children":68,"page":32},"How-to guides","i-lucide-book-open","\u002Fdocs\u002Fhow-to","docs\u002F3.how-to",[69,73,77,81],{"title":70,"path":71,"stem":72,"badge":11},"Collections","\u002Fdocs\u002Fhow-to\u002Fcollections","docs\u002F3.how-to\u002F1.collections",{"title":74,"path":75,"stem":76,"badge":11},"Circular references","\u002Fdocs\u002Fhow-to\u002Fcircular-refs","docs\u002F3.how-to\u002F2.circular-refs",{"title":78,"path":79,"stem":80,"badge":11},"Register, Freeze, and Inject","\u002Fdocs\u002Fhow-to\u002Fregister-freeze-inject","docs\u002F3.how-to\u002F3.register-freeze-inject",{"title":82,"path":83,"stem":84,"badge":11},"Data annotations","\u002Fdocs\u002Fhow-to\u002Fdata-annotations","docs\u002F3.how-to\u002F4.data-annotations",{"title":86,"badge":11,"icon":87,"path":88,"stem":89,"children":90,"page":32},"Extensions","i-lucide-puzzle","\u002Fdocs\u002Fextensions","docs\u002F4.extensions",[91,95],{"title":92,"path":93,"stem":94,"badge":11},"Idioms","\u002Fdocs\u002Fextensions\u002Fidioms","docs\u002F4.extensions\u002F1.idioms",{"title":96,"path":97,"stem":98,"badge":11},"Seed extensions","\u002Fdocs\u002Fextensions\u002Fseed-extensions","docs\u002F4.extensions\u002F2.seed-extensions",{"title":100,"badge":11,"icon":101,"path":102,"stem":103,"children":104,"page":32},"Integrations","i-lucide-plug","\u002Fdocs\u002Fintegrations","docs\u002F5.integrations",[105,109,113,117,121,125,129],{"title":106,"path":107,"stem":108,"badge":11},"Overview","\u002Fdocs\u002Fintegrations\u002Foverview","docs\u002F5.integrations\u002F00.overview",{"title":110,"path":111,"stem":112,"badge":11},"xUnit.net 3","\u002Fdocs\u002Fintegrations\u002Fxunit3","docs\u002F5.integrations\u002F01.xunit3",{"title":114,"path":115,"stem":116,"badge":11},"AutoMoq","\u002Fdocs\u002Fintegrations\u002Fautomoq","docs\u002F5.integrations\u002F02.automoq",{"title":118,"path":119,"stem":120,"badge":11},"NUnit 4","\u002Fdocs\u002Fintegrations\u002Fnunit4","docs\u002F5.integrations\u002F04.nunit4",{"title":122,"path":123,"stem":124,"badge":11},"AutoNSubstitute","\u002Fdocs\u002Fintegrations\u002Fautonsubstitute","docs\u002F5.integrations\u002F06.autonsubstitute",{"title":126,"path":127,"stem":128,"badge":11},"AutoFakeItEasy","\u002Fdocs\u002Fintegrations\u002Fautofakeiteasy","docs\u002F5.integrations\u002F09.autofakeiteasy",{"title":130,"path":131,"stem":132,"badge":133},"TUnit","\u002Fdocs\u002Fintegrations\u002Ftunit","docs\u002F5.integrations\u002F10.tunit",{"label":134,"color":135,"variant":136},"Preview","warning","subtle",{"title":138,"badge":11,"icon":139,"path":140,"stem":141,"children":142,"page":32},"Advanced","i-lucide-cog","\u002Fdocs\u002Fadvanced","docs\u002F6.advanced",[143,146,150],{"title":106,"path":144,"stem":145,"badge":11},"\u002Fdocs\u002Fadvanced\u002Foverview","docs\u002F6.advanced\u002F0.overview",{"title":147,"path":148,"stem":149,"badge":11},"Specimen pipeline","\u002Fdocs\u002Fadvanced\u002Fspecimen-pipeline","docs\u002F6.advanced\u002F1.specimen-pipeline",{"title":151,"path":152,"stem":153,"badge":11},"Specimen builders and specifications","\u002Fdocs\u002Fadvanced\u002Fspecimen-builders-and-specifications","docs\u002F6.advanced\u002F2.specimen-builders-and-specifications",{"title":155,"badge":11,"icon":156,"path":157,"stem":158,"children":159,"page":32},"Reference","i-lucide-library","\u002Fdocs\u002Freference","docs\u002F7.reference",[160,164,168,172,176,180,184],{"title":161,"path":162,"stem":163,"badge":11},"NuGet packages","\u002Fdocs\u002Freference\u002Fpackages","docs\u002F7.reference\u002F1.packages",{"title":165,"path":166,"stem":167,"badge":11},"API reference","\u002Fdocs\u002Freference\u002Fapi-reference","docs\u002F7.reference\u002F2.api-reference",{"title":169,"path":170,"stem":171,"badge":11},"Cheat sheet","\u002Fdocs\u002Freference\u002Fcheat-sheet","docs\u002F7.reference\u002F3.cheat-sheet",{"title":173,"path":174,"stem":175,"badge":11},"FAQ","\u002Fdocs\u002Freference\u002Ffaq","docs\u002F7.reference\u002F4.faq",{"title":177,"path":178,"stem":179,"badge":11},"Compatibility","\u002Fdocs\u002Freference\u002Fcompatibility","docs\u002F7.reference\u002F5.compatibility",{"title":181,"path":182,"stem":183,"badge":11},"v4 to v5 migration","\u002Fdocs\u002Freference\u002Fv4-to-v5-migration","docs\u002F7.reference\u002F6.v4-to-v5-migration",{"title":185,"path":186,"stem":187,"badge":11},"Previous versions","\u002Fdocs\u002Freference\u002Fprevious-versions","docs\u002F7.reference\u002F7.previous-versions",{"defaultPath":189,"packages":190},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1",[191,204,210,215,221,227,232,238,243,248,253,258,264,271,276,281],{"id":192,"name":193,"nugetId":193,"primary":194,"versions":195,"defaultVersion":197,"defaultVersionSegment":198},"autofixture","AutoFixture",true,[196,200],{"version":197,"versionSegment":198,"line":199,"isLatest":194},"5.0.0-rc.1","5-0-0-rc-1","v5",{"version":201,"versionSegment":202,"line":203,"isLatest":32},"4.18.1","4-18-1","v4",{"id":205,"name":206,"nugetId":206,"primary":32,"versions":207,"defaultVersion":197,"defaultVersionSegment":198},"autofakeiteasy","AutoFixture.AutoFakeItEasy",[208,209],{"version":197,"versionSegment":198,"line":199,"isLatest":194},{"version":201,"versionSegment":202,"line":203,"isLatest":32},{"id":211,"name":212,"nugetId":212,"primary":32,"versions":213,"defaultVersion":201,"defaultVersionSegment":202},"autofoq","AutoFixture.AutoFoq",[214],{"version":201,"versionSegment":202,"line":203,"isLatest":194},{"id":216,"name":217,"nugetId":217,"primary":32,"versions":218,"defaultVersion":197,"defaultVersionSegment":198},"automoq","AutoFixture.AutoMoq",[219,220],{"version":197,"versionSegment":198,"line":199,"isLatest":194},{"version":201,"versionSegment":202,"line":203,"isLatest":32},{"id":222,"name":223,"nugetId":223,"primary":32,"versions":224,"defaultVersion":197,"defaultVersionSegment":198},"autonsubstitute","AutoFixture.AutoNSubstitute",[225,226],{"version":197,"versionSegment":198,"line":199,"isLatest":194},{"version":201,"versionSegment":202,"line":203,"isLatest":32},{"id":228,"name":229,"nugetId":229,"primary":32,"versions":230,"defaultVersion":201,"defaultVersionSegment":202},"autorhinomocks","AutoFixture.AutoRhinoMocks",[231],{"version":201,"versionSegment":202,"line":203,"isLatest":194},{"id":233,"name":234,"nugetId":234,"primary":32,"versions":235,"defaultVersion":197,"defaultVersionSegment":198},"idioms","AutoFixture.Idioms",[236,237],{"version":197,"versionSegment":198,"line":199,"isLatest":194},{"version":201,"versionSegment":202,"line":203,"isLatest":32},{"id":239,"name":240,"nugetId":240,"primary":32,"versions":241,"defaultVersion":201,"defaultVersionSegment":202},"idioms-fscheck","AutoFixture.Idioms.FsCheck",[242],{"version":201,"versionSegment":202,"line":203,"isLatest":194},{"id":244,"name":245,"nugetId":245,"primary":32,"versions":246,"defaultVersion":201,"defaultVersionSegment":202},"nunit2","AutoFixture.NUnit2",[247],{"version":201,"versionSegment":202,"line":203,"isLatest":194},{"id":249,"name":250,"nugetId":250,"primary":32,"versions":251,"defaultVersion":201,"defaultVersionSegment":202},"nunit3","AutoFixture.NUnit3",[252],{"version":201,"versionSegment":202,"line":203,"isLatest":194},{"id":254,"name":255,"nugetId":255,"primary":32,"versions":256,"defaultVersion":197,"defaultVersionSegment":198},"nunit4","AutoFixture.NUnit4",[257],{"version":197,"versionSegment":198,"line":199,"isLatest":194},{"id":259,"name":260,"nugetId":260,"primary":32,"versions":261,"defaultVersion":197,"defaultVersionSegment":198},"seedextensions","AutoFixture.SeedExtensions",[262,263],{"version":197,"versionSegment":198,"line":199,"isLatest":194},{"version":201,"versionSegment":202,"line":203,"isLatest":32},{"id":265,"name":266,"nugetId":266,"primary":32,"versions":267,"defaultVersion":269,"defaultVersionSegment":270},"tunit","AutoFixture.TUnit",[268],{"version":269,"versionSegment":270,"line":203,"isLatest":194},"0.1.0-preview0001","0-1-0-preview0001",{"id":272,"name":273,"nugetId":273,"primary":32,"versions":274,"defaultVersion":201,"defaultVersionSegment":202},"xunit","AutoFixture.xUnit",[275],{"version":201,"versionSegment":202,"line":203,"isLatest":194},{"id":277,"name":278,"nugetId":278,"primary":32,"versions":279,"defaultVersion":201,"defaultVersionSegment":202},"xunit2","AutoFixture.xUnit2",[280],{"version":201,"versionSegment":202,"line":203,"isLatest":194},{"id":282,"name":283,"nugetId":283,"primary":32,"versions":284,"defaultVersion":197,"defaultVersionSegment":198},"xunit3","AutoFixture.Xunit3",[285],{"version":197,"versionSegment":198,"line":199,"isLatest":194},[],{"id":288,"title":151,"badge":11,"body":289,"description":1380,"extension":1381,"meta":1382,"navigation":194,"path":152,"seo":1383,"stem":153,"updated":11,"__hash__":1384},"docs\u002Fdocs\u002F6.advanced\u002F2.specimen-builders-and-specifications.md",{"type":290,"value":291,"toc":1370},"minimark",[292,310,325,330,341,411,456,470,474,483,521,538,541,631,637,641,647,718,740,755,759,774,778,787,859,868,936,949,1247,1259,1263,1293,1310,1314,1328,1332,1366],[293,294,295,296,300,301,305,306],"p",{},"AutoFixture resolves every ",[297,298,299],"code",{},"Create"," call through a ",[302,303,304],"strong",{},"graph of specimen builders",". Each node answers one question: ",[307,308,309],"em",{},"given this request, can I produce a specimen?",[293,311,312,313,316,317,320,321,324],{},"This article is about that ",[302,314,315],{},"kernel graph"," — builders, specifications, and how they connect. It is not about nested object graphs produced by ",[297,318,319],{},"Create\u003CT>()","; see ",[322,323,52],"a",{"href":53}," for that.",[326,327,329],"h2",{"id":328},"what-is-a-specimen-builder","What is a specimen builder?",[293,331,332,333,336,337,340],{},"A ",[302,334,335],{},"specimen builder"," implements ",[297,338,339],{},"ISpecimenBuilder",":",[342,343,348],"pre",{"className":344,"code":345,"language":346,"meta":347,"style":347},"language-csharp shiki shiki-themes light-plus light-plus dark-plus","public interface ISpecimenBuilder\n{\n    object Create(object request, ISpecimenContext context);\n}\n","csharp","",[297,349,350,366,373,405],{"__ignoreMap":347},[351,352,355,359,362],"span",{"class":353,"line":354},"line",1,[351,356,358],{"class":357},"stxUP","public",[351,360,361],{"class":357}," interface",[351,363,365],{"class":364},"sopvc"," ISpecimenBuilder\n",[351,367,369],{"class":353,"line":368},2,[351,370,372],{"class":371},"s_Yst","{\n",[351,374,376,379,383,386,389,393,396,399,402],{"class":353,"line":375},3,[351,377,378],{"class":357},"    object",[351,380,382],{"class":381},"swoLU"," Create",[351,384,385],{"class":371},"(",[351,387,388],{"class":357},"object",[351,390,392],{"class":391},"sswaR"," request",[351,394,395],{"class":371},", ",[351,397,398],{"class":364},"ISpecimenContext",[351,400,401],{"class":391}," context",[351,403,404],{"class":371},");\n",[351,406,408],{"class":353,"line":407},4,[351,409,410],{"class":371},"}\n",[412,413,414,436,446],"ul",{},[415,416,417,420,421,424,425,428,429,395,432,435],"li",{},[302,418,419],{},"Request"," — what AutoFixture is trying to create. Often a ",[297,422,423],{},"Type"," (",[297,426,427],{},"typeof(ClientDto)","), but also ",[297,430,431],{},"ParameterInfo",[297,433,434],{},"PropertyInfo",", or custom objects.",[415,437,438,441,442,445],{},[302,439,440],{},"Context"," — ",[297,443,444],{},"ISpecimenContext.Resolve"," creates dependent specimens (constructor arguments, property values, nested types).",[415,447,448,451,452,455],{},[302,449,450],{},"Result"," — a specimen, or ",[297,453,454],{},"NoSpecimen.Instance"," to decline and let the next builder try.",[293,457,458,459,462,463,466,467,469],{},"Builders form a ",[302,460,461],{},"chain of responsibility",". ",[297,464,465],{},"CompositeSpecimenBuilder"," runs children in order until one returns a specimen. See ",[322,468,147],{"href":148}," for where customizations, the engine, and residue collectors sit in the full layout.",[326,471,473],{"id":472},"the-specification-pattern","The specification pattern",[293,475,332,476,424,479,482],{},[302,477,478],{},"request specification",[297,480,481],{},"IRequestSpecification",") decides whether a request matches a rule:",[342,484,486],{"className":344,"code":485,"language":346,"meta":347,"style":347},"public interface IRequestSpecification\n{\n    bool IsSatisfiedBy(object request);\n}\n",[297,487,488,497,501,517],{"__ignoreMap":347},[351,489,490,492,494],{"class":353,"line":354},[351,491,358],{"class":357},[351,493,361],{"class":357},[351,495,496],{"class":364}," IRequestSpecification\n",[351,498,499],{"class":353,"line":368},[351,500,372],{"class":371},[351,502,503,506,509,511,513,515],{"class":353,"line":375},[351,504,505],{"class":357},"    bool",[351,507,508],{"class":381}," IsSatisfiedBy",[351,510,385],{"class":371},[351,512,388],{"class":357},[351,514,392],{"class":391},[351,516,404],{"class":371},[351,518,519],{"class":353,"line":407},[351,520,410],{"class":371},[293,522,523,524,530,531,534,535],{},"This is the ",[322,525,529],{"href":526,"rel":527},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSpecification_pattern",[528],"nofollow","Specification pattern"," applied to specimen ",[302,532,533],{},"requests",", not to domain objects. Specifications answer: ",[307,536,537],{},"should this builder handle this request?",[293,539,540],{},"AutoFixture ships many built-in specifications, including:",[542,543,544,557],"table",{},[545,546,547],"thead",{},[548,549,550,554],"tr",{},[551,552,553],"th",{},"Specification",[551,555,556],{},"Matches",[558,559,560,576,589,602,618],"tbody",{},[548,561,562,571],{},[563,564,565],"td",{},[322,566,568],{"href":567},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.exacttypespecification",[297,569,570],{},"ExactTypeSpecification",[563,572,332,573,575],{},[297,574,423],{}," request equal to a target type",[548,577,578,586],{},[563,579,580],{},[322,581,583],{"href":582},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.parameterspecification",[297,584,585],{},"ParameterSpecification",[563,587,588],{},"A constructor parameter by type and name",[548,590,591,599],{},[563,592,593],{},[322,594,596],{"href":595},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.propertyspecification",[297,597,598],{},"PropertySpecification",[563,600,601],{},"A writable property by type and name",[548,603,604,612],{},[563,605,606],{},[322,607,609],{"href":608},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.abstracttypespecification",[297,610,611],{},"AbstractTypeSpecification",[563,613,614,615,617],{},"Interface or abstract class ",[297,616,423],{}," requests",[548,619,620,628],{},[563,621,622],{},[322,623,625],{"href":624},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.andrequestspecification",[297,626,627],{},"AndRequestSpecification",[563,629,630],{},"All of several specifications",[293,632,633,634,636],{},"You can implement ",[297,635,481],{}," when built-in filters are not enough.",[326,638,640],{"id":639},"specifications-plus-builders-as-a-graph","Specifications plus builders as a graph",[293,642,643,644,340],{},"Most kernel nodes combine ",[302,645,646],{},"filter + action",[542,648,649,659],{},[545,650,651],{},[548,652,653,656],{},[551,654,655],{},"Node",[551,657,658],{},"Role",[558,660,661,674,686,705],{},[548,662,663,671],{},[563,664,665],{},[322,666,668],{"href":667},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.filteringspecimenbuilder",[297,669,670],{},"FilteringSpecimenBuilder",[563,672,673],{},"Runs an inner builder only when a specification matches",[548,675,676,683],{},[563,677,678],{},[322,679,681],{"href":680},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.compositespecimenbuilder",[297,682,465],{},[563,684,685],{},"Tries child builders in order",[548,687,688,696],{},[563,689,690],{},[322,691,693],{"href":692},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.typerelay",[297,694,695],{},"TypeRelay",[563,697,698,699,701,702,704],{},"Maps one ",[297,700,423],{}," request to another (uses ",[297,703,570],{}," internally)",[548,706,707,715],{},[563,708,709],{},[322,710,712],{"href":711},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.fixedbuilder",[297,713,714],{},"FixedBuilder",[563,716,717],{},"Always returns the same specimen",[293,719,720,723,724,726,727,729,730,395,733,735,736,739],{},[297,721,722],{},"Fixture"," wires these into a deep graph at startup — ",[297,725,465],{}," chains for dictionaries and lists, ",[297,728,695],{}," nodes in residue collectors for ",[297,731,732],{},"IList\u003C>",[297,734,670],{}," nodes for invariant culture, and more. Your ",[297,737,738],{},"Customizations.Add"," calls append nodes to the front of that graph.",[293,741,742,743,746,747,754],{},"Think of it as a ",[302,744,745],{},"graph of specification-gated builders",": each edge is ",[307,748,749,750,753],{},"if specification matches, run this builder (which may call ",[297,751,752],{},"context.Resolve"," and trigger more of the graph)",".",[326,756,758],{"id":757},"example-scenario","Example scenario",[293,760,761,762,765,766,769,770,773],{},"You are testing ",[297,763,764],{},"PricingService",", which depends on ",[297,767,768],{},"IOrderRepository"," and a ",[297,771,772],{},"currency"," string constructor parameter. You want a concrete in-memory repository and a fixed currency code without hand-writing the service in every test.",[326,775,777],{"id":776},"example","Example",[293,779,780,783,784,786],{},[302,781,782],{},"Built-in relay"," — map interface ",[297,785,423],{}," requests to a concrete class:",[342,788,790],{"className":344,"code":789,"language":346,"meta":347,"style":347},"var fixture = new Fixture();\nfixture.Customizations.Add(\n    new TypeRelay(typeof(IOrderRepository), typeof(InMemoryOrderRepository)));\n",[297,791,792,812,829],{"__ignoreMap":347},[351,793,794,797,800,803,806,809],{"class":353,"line":354},[351,795,796],{"class":357},"var",[351,798,799],{"class":391}," fixture",[351,801,802],{"class":371}," = ",[351,804,805],{"class":357},"new",[351,807,808],{"class":364}," Fixture",[351,810,811],{"class":371},"();\n",[351,813,814,817,819,821,823,826],{"class":353,"line":368},[351,815,816],{"class":391},"fixture",[351,818,754],{"class":371},[351,820,48],{"class":391},[351,822,754],{"class":371},[351,824,825],{"class":381},"Add",[351,827,828],{"class":371},"(\n",[351,830,831,834,837,839,842,844,846,849,851,853,856],{"class":353,"line":375},[351,832,833],{"class":357},"    new",[351,835,836],{"class":364}," TypeRelay",[351,838,385],{"class":371},[351,840,841],{"class":357},"typeof",[351,843,385],{"class":371},[351,845,768],{"class":364},[351,847,848],{"class":371},"), ",[351,850,841],{"class":357},[351,852,385],{"class":371},[351,854,855],{"class":364},"InMemoryOrderRepository",[351,857,858],{"class":371},")));\n",[293,860,861,864,865,867],{},[302,862,863],{},"Built-in specification + builder"," — pin the ",[297,866,772],{}," parameter:",[342,869,871],{"className":344,"code":870,"language":346,"meta":347,"style":347},"fixture.Customizations.Add(\n    new FilteringSpecimenBuilder(\n        new FixedBuilder(\"EUR\"),\n        new ParameterSpecification(typeof(string), \"currency\")));\n",[297,872,873,887,896,913],{"__ignoreMap":347},[351,874,875,877,879,881,883,885],{"class":353,"line":354},[351,876,816],{"class":391},[351,878,754],{"class":371},[351,880,48],{"class":391},[351,882,754],{"class":371},[351,884,825],{"class":381},[351,886,828],{"class":371},[351,888,889,891,894],{"class":353,"line":368},[351,890,833],{"class":357},[351,892,893],{"class":364}," FilteringSpecimenBuilder",[351,895,828],{"class":371},[351,897,898,901,904,906,910],{"class":353,"line":375},[351,899,900],{"class":357},"        new",[351,902,903],{"class":364}," FixedBuilder",[351,905,385],{"class":371},[351,907,909],{"class":908},"sFD8J","\"EUR\"",[351,911,912],{"class":371},"),\n",[351,914,915,917,920,922,924,926,929,931,934],{"class":353,"line":407},[351,916,900],{"class":357},[351,918,919],{"class":364}," ParameterSpecification",[351,921,385],{"class":371},[351,923,841],{"class":357},[351,925,385],{"class":371},[351,927,928],{"class":357},"string",[351,930,848],{"class":371},[351,932,933],{"class":908},"\"currency\"",[351,935,858],{"class":371},[293,937,938,941,942,945,946,340],{},[302,939,940],{},"Custom specification"," — only handle ",[297,943,944],{},"decimal"," property requests named ",[297,947,948],{},"MinimumOrderAmount",[342,950,952],{"className":344,"code":951,"language":346,"meta":347,"style":347},"fixture.Customizations.Add(\n    new FilteringSpecimenBuilder(\n        new FixedBuilder(25m),\n        new MinimumOrderAmountPropertySpecification()));\n\nvar service = fixture.Create\u003CPricingService>();\n\nAssert.IsType\u003CInMemoryOrderRepository>(service.Repository);\nAssert.Equal(\"EUR\", service.Currency);\nAssert.Equal(25m, service.MinimumOrderAmount);\n\npublic sealed class MinimumOrderAmountPropertySpecification : IRequestSpecification\n{\n    public bool IsSatisfiedBy(object request)\n    {\n        return request is PropertyInfo property\n            && property.PropertyType == typeof(decimal)\n            && property.Name == nameof(PricingService.MinimumOrderAmount);\n    }\n}\n",[297,953,954,968,976,990,1000,1006,1030,1035,1063,1088,1111,1116,1135,1140,1160,1166,1184,1209,1236,1242],{"__ignoreMap":347},[351,955,956,958,960,962,964,966],{"class":353,"line":354},[351,957,816],{"class":391},[351,959,754],{"class":371},[351,961,48],{"class":391},[351,963,754],{"class":371},[351,965,825],{"class":381},[351,967,828],{"class":371},[351,969,970,972,974],{"class":353,"line":368},[351,971,833],{"class":357},[351,973,893],{"class":364},[351,975,828],{"class":371},[351,977,978,980,982,984,988],{"class":353,"line":375},[351,979,900],{"class":357},[351,981,903],{"class":364},[351,983,385],{"class":371},[351,985,987],{"class":986},"s-S-M","25m",[351,989,912],{"class":371},[351,991,992,994,997],{"class":353,"line":407},[351,993,900],{"class":357},[351,995,996],{"class":364}," MinimumOrderAmountPropertySpecification",[351,998,999],{"class":371},"()));\n",[351,1001,1003],{"class":353,"line":1002},5,[351,1004,1005],{"emptyLinePlaceholder":194},"\n",[351,1007,1009,1011,1014,1016,1018,1020,1022,1025,1027],{"class":353,"line":1008},6,[351,1010,796],{"class":357},[351,1012,1013],{"class":391}," service",[351,1015,802],{"class":371},[351,1017,816],{"class":391},[351,1019,754],{"class":371},[351,1021,299],{"class":381},[351,1023,1024],{"class":371},"\u003C",[351,1026,764],{"class":364},[351,1028,1029],{"class":371},">();\n",[351,1031,1033],{"class":353,"line":1032},7,[351,1034,1005],{"emptyLinePlaceholder":194},[351,1036,1038,1041,1043,1046,1048,1050,1053,1056,1058,1061],{"class":353,"line":1037},8,[351,1039,1040],{"class":391},"Assert",[351,1042,754],{"class":371},[351,1044,1045],{"class":381},"IsType",[351,1047,1024],{"class":371},[351,1049,855],{"class":364},[351,1051,1052],{"class":371},">(",[351,1054,1055],{"class":391},"service",[351,1057,754],{"class":371},[351,1059,1060],{"class":391},"Repository",[351,1062,404],{"class":371},[351,1064,1066,1068,1070,1073,1075,1077,1079,1081,1083,1086],{"class":353,"line":1065},9,[351,1067,1040],{"class":391},[351,1069,754],{"class":371},[351,1071,1072],{"class":381},"Equal",[351,1074,385],{"class":371},[351,1076,909],{"class":908},[351,1078,395],{"class":371},[351,1080,1055],{"class":391},[351,1082,754],{"class":371},[351,1084,1085],{"class":391},"Currency",[351,1087,404],{"class":371},[351,1089,1091,1093,1095,1097,1099,1101,1103,1105,1107,1109],{"class":353,"line":1090},10,[351,1092,1040],{"class":391},[351,1094,754],{"class":371},[351,1096,1072],{"class":381},[351,1098,385],{"class":371},[351,1100,987],{"class":986},[351,1102,395],{"class":371},[351,1104,1055],{"class":391},[351,1106,754],{"class":371},[351,1108,948],{"class":391},[351,1110,404],{"class":371},[351,1112,1114],{"class":353,"line":1113},11,[351,1115,1005],{"emptyLinePlaceholder":194},[351,1117,1119,1121,1124,1127,1129,1132],{"class":353,"line":1118},12,[351,1120,358],{"class":357},[351,1122,1123],{"class":357}," sealed",[351,1125,1126],{"class":357}," class",[351,1128,996],{"class":364},[351,1130,1131],{"class":371}," : ",[351,1133,1134],{"class":364},"IRequestSpecification\n",[351,1136,1138],{"class":353,"line":1137},13,[351,1139,372],{"class":371},[351,1141,1143,1146,1149,1151,1153,1155,1157],{"class":353,"line":1142},14,[351,1144,1145],{"class":357},"    public",[351,1147,1148],{"class":357}," bool",[351,1150,508],{"class":381},[351,1152,385],{"class":371},[351,1154,388],{"class":357},[351,1156,392],{"class":391},[351,1158,1159],{"class":371},")\n",[351,1161,1163],{"class":353,"line":1162},15,[351,1164,1165],{"class":371},"    {\n",[351,1167,1169,1173,1175,1178,1181],{"class":353,"line":1168},16,[351,1170,1172],{"class":1171},"smUd-","        return",[351,1174,392],{"class":391},[351,1176,1177],{"class":357}," is",[351,1179,1180],{"class":364}," PropertyInfo",[351,1182,1183],{"class":391}," property\n",[351,1185,1187,1190,1193,1195,1198,1201,1203,1205,1207],{"class":353,"line":1186},17,[351,1188,1189],{"class":371},"            && ",[351,1191,1192],{"class":391},"property",[351,1194,754],{"class":371},[351,1196,1197],{"class":391},"PropertyType",[351,1199,1200],{"class":371}," == ",[351,1202,841],{"class":357},[351,1204,385],{"class":371},[351,1206,944],{"class":357},[351,1208,1159],{"class":371},[351,1210,1212,1214,1216,1218,1221,1223,1226,1228,1230,1232,1234],{"class":353,"line":1211},18,[351,1213,1189],{"class":371},[351,1215,1192],{"class":391},[351,1217,754],{"class":371},[351,1219,1220],{"class":391},"Name",[351,1222,1200],{"class":371},[351,1224,1225],{"class":357},"nameof",[351,1227,385],{"class":371},[351,1229,764],{"class":391},[351,1231,754],{"class":371},[351,1233,948],{"class":391},[351,1235,404],{"class":371},[351,1237,1239],{"class":353,"line":1238},19,[351,1240,1241],{"class":371},"    }\n",[351,1243,1245],{"class":353,"line":1244},20,[351,1246,410],{"class":371},[293,1248,1249,1251,1252,1254,1255,1258],{},[297,1250,695],{}," and ",[297,1253,670],{}," are composed with built-in specifications. ",[297,1256,1257],{},"MinimumOrderAmountPropertySpecification"," is custom, but plugs into the same graph shape.",[326,1260,1262],{"id":1261},"how-it-works","How it works",[412,1264,1265,1274,1282,1290],{},[415,1266,1267,1268,1270,1271,1273],{},"Every ",[297,1269,319],{}," enters the graph with a ",[297,1272,423],{}," request; reflection triggers subsidiary requests for parameters and properties.",[415,1275,1276,1278,1279,1281],{},[297,1277,670],{}," returns ",[297,1280,454],{}," when the specification fails — the composite moves to the next sibling.",[415,1283,1284,1286,1287,1289],{},[297,1285,695],{}," does not construct directly; it calls ",[297,1288,752],{}," for the target type, re-entering the graph.",[415,1291,1292],{},"Customizations prepend nodes; residue collectors append fallbacks after the engine. Same builder types, different positions.",[293,1294,1295,1296,395,1299,1302,1303,1305,1306,1309],{},"Prefer ",[322,1297,1298],{"href":49},"Register",[322,1300,1301],{"href":49},"Customize",", and ",[322,1304,44],{"href":45}," when they express your rule. Reach for specification-gated builders when you need precise control over ",[302,1307,1308],{},"which requests"," in the graph are affected.",[326,1311,1313],{"id":1312},"next-steps","Next steps",[412,1315,1316,1320,1324],{},[415,1317,1318],{},[322,1319,106],{"href":144},[415,1321,1322],{},[322,1323,147],{"href":148},[415,1325,1326],{},[322,1327,48],{"href":49},[326,1329,1331],{"id":1330},"api","API",[412,1333,1334,1341,1348,1354,1360],{},[415,1335,1336],{},[322,1337,1339],{"href":1338},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.ispecimenbuilder",[297,1340,339],{},[415,1342,1343],{},[322,1344,1346],{"href":1345},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel.irequestspecification",[297,1347,481],{},[415,1349,1350],{},[322,1351,1352],{"href":667},[297,1353,670],{},[415,1355,1356],{},[322,1357,1358],{"href":692},[297,1359,695],{},[415,1361,1362],{},[322,1363,1365],{"href":1364},"\u002Fapi\u002Fautofixture\u002F5-0-0-rc-1\u002Fautofixture.kernel","Kernel namespace",[1367,1368,1369],"style",{},"html pre.shiki code .stxUP, html code.shiki .stxUP{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#569CD6}html pre.shiki code .sopvc, html code.shiki .sopvc{--shiki-light:#267F99;--shiki-default:#267F99;--shiki-dark:#4EC9B0}html pre.shiki code .s_Yst, html code.shiki .s_Yst{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#D4D4D4}html pre.shiki code .swoLU, html code.shiki .swoLU{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#DCDCAA}html pre.shiki code .sswaR, html code.shiki .sswaR{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#9CDCFE}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sFD8J, html code.shiki .sFD8J{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#CE9178}html pre.shiki code .s-S-M, html code.shiki .s-S-M{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#B5CEA8}html pre.shiki code .smUd-, html code.shiki .smUd-{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#C586C0}",{"title":347,"searchDepth":368,"depth":368,"links":1371},[1372,1373,1374,1375,1376,1377,1378,1379],{"id":328,"depth":368,"text":329},{"id":472,"depth":368,"text":473},{"id":639,"depth":368,"text":640},{"id":757,"depth":368,"text":758},{"id":776,"depth":368,"text":777},{"id":1261,"depth":368,"text":1262},{"id":1312,"depth":368,"text":1313},{"id":1330,"depth":368,"text":1331},"How ISpecimenBuilder nodes and IRequestSpecification filters compose into AutoFixture's kernel graph.","md",{},{"title":151,"description":1380},"2CmWte5VDHtCcdwmabVGrpdDRWaQZjXuiW82jnKgcLE",[1386,1387],{"title":147,"path":148,"stem":149,"children":-1},{"title":161,"path":162,"stem":163,"children":-1},1788856648531]