Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php namespace Clockwork\Support\Laravel\Tests;use Clockwork\Helpers\Serializer;use Clockwork\Helpers\StackFilter;use Clockwork\Helpers\StackTrace;use PHPUnit\Framework\Constraint\Constraint;use PHPUnit\Runner\BaseTestRunner;// Trait to include in PHPUnit tests to collect executed teststrait UsesClockwork{// Clockwork phpunit metadata collected while executing testsprotected static $clockwork = ['asserts' => []];// Set up Clockwork in this test case, should be called from the PHPUnit setUp methodprotected function setUpClockwork(){if (! $this->app->make('clockwork.support')->isCollectingTests()) return;$this->beforeApplicationDestroyed(function () {if ($this->app->make('clockwork.support')->isTestFiltered($this->toString())) return;$this->app->make('clockwork')->resolveAsTest($this->toString(),$this->resolveClockworkStatus(),$this->getStatusMessage(),$this->resolveClockworkAsserts())->storeRequest();});}// Resolve Clockwork test statusprotected function resolveClockworkStatus(){$status = $this->getStatus();$statuses = [BaseTestRunner::STATUS_UNKNOWN => 'unknown',BaseTestRunner::STATUS_PASSED => 'passed',BaseTestRunner::STATUS_SKIPPED => 'skipped',BaseTestRunner::STATUS_INCOMPLETE => 'incomplete',BaseTestRunner::STATUS_FAILURE => 'failed',BaseTestRunner::STATUS_ERROR => 'error',BaseTestRunner::STATUS_RISKY => 'passed',BaseTestRunner::STATUS_WARNING => 'warning'];return isset($statuses[$status]) ? $statuses[$status] : null;}// Resolve executed assertsprotected function resolveClockworkAsserts(){$asserts = static::$clockwork['asserts'];if ($this->getStatus() == BaseTestRunner::STATUS_FAILURE && count($asserts)) {$asserts[count($asserts) - 1]['passed'] = false;}static::$clockwork['asserts'] = [];return $asserts;}// Overload the main PHPUnit assert method to collect executed assertspublic static function assertThat($value, Constraint $constraint, string $message = ''): void{$trace = StackTrace::get([ 'arguments' => true, 'limit' => 10 ]);$assertFrame = $trace->filter(function ($frame) { return strpos($frame->function, 'assert') === 0; })->last();$trace = $trace->skip(StackFilter::make()->isNotVendor([ 'itsgoingd', 'phpunit' ]))->limit(3);static::$clockwork['asserts'][] = ['name' => $assertFrame->function,'arguments' => $assertFrame->args,'trace' => (new Serializer)->trace($trace),'passed' => true];parent::assertThat($value, $constraint, $message);}}