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: 2026-03-09 05:56:49 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));
}
}