fix: global afterEach being called twice

This commit is contained in:
Nuno Maduro
2024-09-11 00:40:41 +01:00
parent ea72461f1b
commit 32881774d2
6 changed files with 104 additions and 23 deletions

View File

@ -116,7 +116,7 @@ trait Testable
self::$__latestIssues = $method->issues;
self::$__latestPrs = $method->prs;
$this->__describing = $method->describing;
$this->__test = $method->getClosure($this);
$this->__test = $method->getClosure();
}
}
@ -240,6 +240,8 @@ trait Testable
$method = TestSuite::getInstance()->tests->get(self::$__filename)->getMethod($this->name());
$method->setUp($this);
$description = $method->description;
if ($this->dataName()) {
$description = str_contains((string) $description, ':dataset')
@ -298,6 +300,9 @@ trait Testable
parent::tearDown();
TestSuite::getInstance()->test = null;
$method = TestSuite::getInstance()->tests->get(self::$__filename)->getMethod($this->name());
$method->tearDown($this);
}
}
@ -392,11 +397,12 @@ trait Testable
fn (ReflectionParameter $reflectionParameter): string => $reflectionParameter->getName(),
array_filter($testReflection->getParameters(), fn (ReflectionParameter $reflectionParameter): bool => ! $reflectionParameter->isOptional()),
);
if (array_diff($testParameterNames, $datasetParameterNames) === []) {
return;
}
if (isset($testParameterNames[0])
&& $suppliedParametersCount >= $requiredParametersCount) {
if (isset($testParameterNames[0]) && $suppliedParametersCount >= $requiredParametersCount) {
return;
}

View File

@ -118,9 +118,9 @@ final class TestCaseMethodFactory
}
/**
* Creates the test's closure.
* Sets the test's hooks, and runs any proxy to the test case.
*/
public function getClosure(TestCase $concrete): Closure
public function setUp(TestCase $concrete): void
{
$concrete::flush(); // @phpstan-ignore-line
@ -128,14 +128,29 @@ final class TestCaseMethodFactory
throw ShouldNotHappen::fromMessage('Description can not be empty.');
}
$closure = $this->closure;
$testCase = TestSuite::getInstance()->tests->get($this->filename);
assert($testCase instanceof TestCaseFactory);
$testCase->factoryProxies->proxy($concrete);
$this->factoryProxies->proxy($concrete);
}
/**
* Flushes the test case.
*/
public function tearDown(TestCase $concrete): void
{
$concrete::flush(); // @phpstan-ignore-line
}
/**
* Creates the test's closure.
*/
public function getClosure(): Closure
{
$closure = $this->closure;
$testCase = TestSuite::getInstance()->tests->get($this->filename);
assert($testCase instanceof TestCaseFactory);
$method = $this;
return function (...$arguments) use ($testCase, $method, $closure): mixed { // @phpstan-ignore-line
@ -209,10 +224,8 @@ final class TestCaseMethodFactory
$attributesCode
public function $methodName(...\$arguments)
{
\$test = \Pest\TestSuite::getInstance()->tests->get(self::\$__filename)->getMethod(\$this->name())->getClosure(\$this);
return \$this->__runTest(
\$test,
\$this->__test,
...\$arguments,
);
}