nathanburkett / mesa-phpunit
PHPUnit DataSet Organization and Orchestration
0.2.0
2020-02-08 16:57 UTC
Requires
- php: ^7.1
- nathanburkett/mesa: 0.1.0
- phpunit/phpunit: ^8.5
Requires (Dev)
- phpmd/phpmd: ^2.8
- squizlabs/php_codesniffer: ^3.5
- vimeo/psalm: ^3.8
This package is auto-updated.
Last update: 2025-01-09 03:33:52 UTC
README
PHPUnit Mesa is a table-driven approach to orchestrating data providers in PHPUnit
Installation
Via composer
composer require nathanburkett/mesa-phpunit --dev
Usage
Via GeneratesTestCases
Trait
Using the GeneratesTestCases
trait is the simplest way to start consuming tables in PHPUnit.
<?php namespace Foo\Bar\Baz; use PHPUnit\Framework\TestCase; use NathanBurkett\Mesa\Fixture\PHPUnit\GeneratesTestCases; class FooTest extends TestCase { use GeneratesTestCases; }
Given a php file of test cases:
<?php // Location __DIR__ . '/DataSets/FooTest/OutputTestCases.php use PHPUnit\Framework\TestCase; use PHPUnit\MockObject\MockObject; return [ 'Expects \'foo\' output' => [ 'setupDependencyOneExpectations' => function (TestCase $test, MockObject $dependencyOne): MockObject { $dependencyOne->expects($test->once())->method('foo')->willReturn(true); return $dependencyOne; }, 'config' => 'Some config', 'expected' => 'FooBarBaz', ], ];
Then build a table targeting a data provider like so:
<?php namespace Foo\Bar\Baz; use PHPUnit\Framework\TestCase; use NathanBurkett\Mesa\Fixture\PHPUnit\GeneratesTestCases; class FooTest extends TestCase { use GeneratesTestCases; /** * @dataProvider generateOutputTestCases * * @param DependencyOne $dependencyOne * @param string $config * @param string $expected */ public function testOutput(DependencyOne $dependencyOne, string $config, string $expected) { $service = new FooService($dependencyOne, $config); $actual = $service->run(); $this->assertEquals($expected, $actual); } /** * @return \Generator */ public function generateOutputTestCases(): \Generator { yield from $this->generateTestCases( 'OutputTestCases.php' // this defaults to looking for test cases in __DIR__ . /DataSets/{ClassName}/{string} // [$this, 'setupOutputTestCase'] Optional setup func ); } /** * @param array $testCase * @return array */ public function setupOutputTestCase(array $testCase): array { $dependencyOne = $this->getMockBuilder(DependencyOne::class) ->disableOriginalConstructor() ->getMock(); return [ $testCase['setupDependencyOneExpectations']($this, $dependencyOne), $testCase['config'], $testCase['expected'], ]; } }
To change default directory where data sets are resolved on a class by class basis, extend PHPUnitDataSetPathResolver and supply a different value for DEFAULT_DIRECTORY
constant:
<?php namespace Foo\Bar\Baz; use NathanBurkett\Mesa\Fixture\PHPUnit\PathResolver\PHPUnitDataSetPathResolver; class NewPHPUnitPathResolver extends PHPUnitDataSetPathResolver { /** * @var string */ public const DEFAULT_DIRECTORY = 'TestCases'; }
And inside your testing class:
<?php namespace Foo\Bar\Baz; use PHPUnit\Framework\TestCase; use Foo\Bar\Baz\NewPHPUnitPathResolver; use NathanBurkett\Mesa\Fixture\PHPUnit\GeneratesTestCases; use NathanBurkett\Mesa\Fixture\PHPUnit\PathResolver\PathResolver; class FooTest extends TestCase { use GeneratesTestCases; /** * @return PathResolver */ protected function getTestCasePathResolver(): PathResolver { return new NewPHPUnitPathResolver((string) $this->testCaseContext, new \ReflectionClass($this)); } }