PHPUnit Assertion Closures
![](/images/2024-06-28/lambdafactory_hu04cf4642dd4db89db22ee9edf056573b_47890_300x300_fit_box_3.png)
One of the testing patterns that I’ve selected for over the years is combining data providers and Closure:
<?php /** * @param Closure(TraitImports):void $assertion */ #[DataProvider('provideTraitImports')] public function testTraitImports(string $source, Closure $assertion): void { $rootNode = $this->parseSource($source); $classDeclaration = $rootNode->getFirstDescendantNode(ClassDeclaration::class); $assertion(TraitImports::forClassDeclaration($classDeclaration)); } This pattern can be used to succinctly break down tests to their input and expectation:
<?php /** * @return Generator<string,array{string,Closure(TraitImports): void}> */ public static function provideTraitImports(): Generator { yield 'simple use' => [ '<?
Read more...