mirror of
https://github.com/pestphp/pest.git
synced 2026-03-06 15:57:21 +01:00
Merge pull request #652 from pestphp/feature/to-have-methods
feat: add support for `toHaveMethod` and `toHaveMethods`
This commit is contained in:
@ -302,6 +302,36 @@ final class Expectation
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that the value has the method $name.
|
||||||
|
*
|
||||||
|
* @return self<TValue>
|
||||||
|
*/
|
||||||
|
public function toHaveMethod(string $name, string $message = ''): self
|
||||||
|
{
|
||||||
|
$this->toBeObject();
|
||||||
|
|
||||||
|
// @phpstan-ignore-next-line
|
||||||
|
Assert::assertTrue(method_exists($this->value, $name), $message);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asserts that the value has the provided methods $names.
|
||||||
|
*
|
||||||
|
* @param iterable<array-key, string> $names
|
||||||
|
* @return self<TValue>
|
||||||
|
*/
|
||||||
|
public function toHaveMethods(iterable $names, string $message = ''): self
|
||||||
|
{
|
||||||
|
foreach ($names as $name) {
|
||||||
|
$this->toHaveMethod($name, message: $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asserts that two variables have the same value.
|
* Asserts that two variables have the same value.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
##teamcity[testSuiteStarted name='Tests/tests/Failure' locationHint='file://tests/.tests/Failure.php' flowId='1234']
|
##teamcity[testSuiteStarted name='Tests/tests/Failure' locationHint='file://tests/.tests/Failure.php' flowId='1234']
|
||||||
##teamcity[testStarted name='it can fail with comparison' locationHint='pest_qn://tests/.tests/Failure.php::it can fail with comparison' flowId='1234']
|
##teamcity[testStarted name='it can fail with comparison' locationHint='pest_qn://tests/.tests/Failure.php::it can fail with comparison' flowId='1234']
|
||||||
##teamcity[testFailed name='it can fail with comparison' message='Failed asserting that true matches expected false.' details='at src/Mixins/Expectation.php:312|nat src/Support/ExpectationPipeline.php:75|nat src/Support/ExpectationPipeline.php:79|nat src/Expectation.php:300|nat tests/.tests/Failure.php:6|nat src/Factories/TestCaseMethodFactory.php:106|nat src/Concerns/Testable.php:262|nat src/Support/ExceptionTrace.php:28|nat src/Concerns/Testable.php:262|nat src/Concerns/Testable.php:217|nat src/Kernel.php:79' type='comparisonFailure' actual='true' expected='false' flowId='1234']
|
##teamcity[testFailed name='it can fail with comparison' message='Failed asserting that true matches expected false.' details='at src/Mixins/Expectation.php:342|nat src/Support/ExpectationPipeline.php:75|nat src/Support/ExpectationPipeline.php:79|nat src/Expectation.php:300|nat tests/.tests/Failure.php:6|nat src/Factories/TestCaseMethodFactory.php:106|nat src/Concerns/Testable.php:262|nat src/Support/ExceptionTrace.php:28|nat src/Concerns/Testable.php:262|nat src/Concerns/Testable.php:217|nat src/Kernel.php:79' type='comparisonFailure' actual='true' expected='false' flowId='1234']
|
||||||
##teamcity[testFinished name='it can fail with comparison' duration='100000' flowId='1234']
|
##teamcity[testFinished name='it can fail with comparison' duration='100000' flowId='1234']
|
||||||
##teamcity[testStarted name='it can be ignored because of no assertions' locationHint='pest_qn://tests/.tests/Failure.php::it can be ignored because of no assertions' flowId='1234']
|
##teamcity[testStarted name='it can be ignored because of no assertions' locationHint='pest_qn://tests/.tests/Failure.php::it can be ignored because of no assertions' flowId='1234']
|
||||||
##teamcity[testIgnored name='it can be ignored because of no assertions' message='This test did not perform any assertions' details='' flowId='1234']
|
##teamcity[testIgnored name='it can be ignored because of no assertions' message='This test did not perform any assertions' details='' flowId='1234']
|
||||||
|
|||||||
@ -556,6 +556,18 @@
|
|||||||
✓ it fails
|
✓ it fails
|
||||||
✓ it fails with message
|
✓ it fails with message
|
||||||
|
|
||||||
|
PASS Tests\Features\Expect\toHaveMethod
|
||||||
|
✓ pass
|
||||||
|
✓ failures
|
||||||
|
✓ failures with message
|
||||||
|
✓ not failures
|
||||||
|
|
||||||
|
PASS Tests\Features\Expect\toHaveMethods
|
||||||
|
✓ pass
|
||||||
|
✓ failures
|
||||||
|
✓ failures with custom message
|
||||||
|
✓ not failures
|
||||||
|
|
||||||
PASS Tests\Features\Expect\toHaveProperties
|
PASS Tests\Features\Expect\toHaveProperties
|
||||||
✓ pass
|
✓ pass
|
||||||
✓ failures
|
✓ failures
|
||||||
@ -902,4 +914,4 @@
|
|||||||
PASS Tests\Visual\Version
|
PASS Tests\Visual\Version
|
||||||
✓ visual snapshot of help command output
|
✓ visual snapshot of help command output
|
||||||
|
|
||||||
Tests: 4 incomplete, 4 todos, 18 skipped, 625 passed (1512 assertions)
|
Tests: 4 incomplete, 4 todos, 18 skipped, 633 passed (1552 assertions)
|
||||||
28
tests/Features/Expect/toHaveMethod.php
Normal file
28
tests/Features/Expect/toHaveMethod.php
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use PHPUnit\Framework\ExpectationFailedException;
|
||||||
|
|
||||||
|
$object = new class
|
||||||
|
{
|
||||||
|
public function foo(): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
test('pass', function () use ($object) {
|
||||||
|
expect($object)->toHaveMethod('foo')
|
||||||
|
->and($object)->toHaveMethod('foo')
|
||||||
|
->and($object)->not->toHaveMethod('fooNull');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('failures', function () use ($object) {
|
||||||
|
expect($object)->toHaveMethod('bar');
|
||||||
|
})->throws(ExpectationFailedException::class);
|
||||||
|
|
||||||
|
test('failures with message', function () use ($object) {
|
||||||
|
expect($object)->toHaveMethod(name: 'bar', message: 'oh no!');
|
||||||
|
})->throws(ExpectationFailedException::class, 'oh no!');
|
||||||
|
|
||||||
|
test('not failures', function () use ($object) {
|
||||||
|
expect($object)->not->toHaveMethod('foo');
|
||||||
|
})->throws(ExpectationFailedException::class);
|
||||||
30
tests/Features/Expect/toHaveMethods.php
Normal file
30
tests/Features/Expect/toHaveMethods.php
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use PHPUnit\Framework\ExpectationFailedException;
|
||||||
|
|
||||||
|
$object = new class
|
||||||
|
{
|
||||||
|
public function foo(): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public function bar(): void
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
test('pass', function () use ($object) {
|
||||||
|
expect($object)->toHaveMethods(['foo', 'bar']);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('failures', function () use ($object) {
|
||||||
|
expect($object)->toHaveMethods(['foo', 'bar', 'baz']);
|
||||||
|
})->throws(ExpectationFailedException::class);
|
||||||
|
|
||||||
|
test('failures with custom message', function () use ($object) {
|
||||||
|
expect($object)->toHaveMethods(['foo', 'bar', 'baz'], 'oh no!');
|
||||||
|
})->throws(ExpectationFailedException::class, 'oh no!');
|
||||||
|
|
||||||
|
test('not failures', function () use ($object) {
|
||||||
|
expect($object)->not->toHaveMethods(['foo', 'bar']);
|
||||||
|
})->throws(ExpectationFailedException::class);
|
||||||
Reference in New Issue
Block a user