Higher Order Tests now resolve callable expectations. The tap method now always returns the test case.

This commit is contained in:
luke
2021-07-06 14:05:40 +01:00
parent c290909eb3
commit 7e9edecc7f
5 changed files with 48 additions and 13 deletions

View File

@ -7,15 +7,15 @@ namespace Pest\PendingObjects;
use Closure; use Closure;
use Pest\Factories\TestCaseFactory; use Pest\Factories\TestCaseFactory;
use Pest\Support\Backtrace; use Pest\Support\Backtrace;
use Pest\Support\HigherOrderCallables;
use Pest\Support\NullClosure; use Pest\Support\NullClosure;
use Pest\TestSuite; use Pest\TestSuite;
use SebastianBergmann\Exporter\Exporter; use SebastianBergmann\Exporter\Exporter;
/* /**
* @mixin \Pest\Support\HigherOrderCallables
* @method \Pest\Expectations\Expectation expect(mixed $value)
*
* @internal * @internal
*
* @mixin HigherOrderCallables
*/ */
final class TestCall final class TestCall
{ {

View File

@ -81,7 +81,6 @@ final class Coverage implements AddsOutput, HandlesArguments
} }
if ($input->getOption(self::MIN_OPTION) !== null) { if ($input->getOption(self::MIN_OPTION) !== null) {
/* @phpstan-ignore-next-line */
$this->coverageMin = (float) $input->getOption(self::MIN_OPTION); $this->coverageMin = (float) $input->getOption(self::MIN_OPTION);
} }

View File

@ -4,6 +4,8 @@ declare(strict_types=1);
namespace Pest\Support; namespace Pest\Support;
use Pest\Expectation;
/** /**
* @internal * @internal
*/ */
@ -19,6 +21,34 @@ final class HigherOrderCallables
$this->target = $target; $this->target = $target;
} }
/**
* @template TValue
*
* Create a new expectation. Callable values will be executed prior to returning the new expectation.
*
* @param callable|TValue $value
*
* @return Expectation<TValue>
*/
public function expect($value)
{
return new Expectation(is_callable($value) ? Reflection::bindCallable($value) : $value);
}
/**
* @template TValue
*
* Create a new expectation. Callable values will be executed prior to returning the new expectation.
*
* @param callable|TValue $value
*
* @return Expectation<TValue>
*/
public function and($value)
{
return $this->expect($value);
}
/** /**
* @template TValue * @template TValue
* *
@ -28,6 +58,8 @@ final class HigherOrderCallables
*/ */
public function tap(callable $callable) public function tap(callable $callable)
{ {
return Reflection::bindCallable($callable) ?? $this->target; Reflection::bindCallable($callable);
return $this->target;
} }
} }

View File

@ -410,8 +410,8 @@
PASS Tests\Features\HigherOrderTests PASS Tests\Features\HigherOrderTests
✓ it proxies calls to object ✓ it proxies calls to object
✓ it is capable doing multiple assertions ✓ it is capable doing multiple assertions
✓ it resolves expect callables correctly
✓ it can tap into the test ✓ it can tap into the test
✓ it can use the returned instance from a tap
WARN Tests\Features\Incompleted WARN Tests\Features\Incompleted
… incompleted … incompleted

View File

@ -10,14 +10,18 @@ it('is capable doing multiple assertions')
->assertTrue(true) ->assertTrue(true)
->assertFalse(false); ->assertFalse(false);
it('resolves expect callables correctly')
->expect(function () { return 'foo'; })
->toBeString()
->toBe('foo')
->and('bar')
->toBeString()
->toBe('bar');
it('can tap into the test') it('can tap into the test')
->expect('foo')->toBeString()->toBe('foo') ->expect('foo')->toBeString()
->tap(function () { expect($this)->toBeInstanceOf(TestCase::class); }) ->tap(function () { expect($this)->toBeInstanceOf(TestCase::class); })
->toBe('foo')
->and('hello world')->toBeString(); ->and('hello world')->toBeString();
it('can use the returned instance from a tap')
->expect('foo')->toBeString()->toBe('foo')
->tap(function () { return expect($this); })
->toBeInstanceOf(TestCase::class);
afterEach()->assertTrue(true); afterEach()->assertTrue(true);