Codeception / Codeception/MockeryModule
Fully automate the module without requiring changes to tests
- Lenguaje dominante
- PHP
- Estrellas
- 34
- Forks
- 12
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Descripción
Currently using this module requires changes in each test.
I have found an ugly way to alleviate that problem.
The code below was tested for `Cest` type tests only. It should not break for any other test type but might simply not work.
```php
use Codeception\Lib\Di;
use Codeception\Module;
use Codeception\TestInterface;
class Mockery extends Module
{
public function _before(TestInterface $test)
{
$meta = $test->getMetadata();
$rc = new \ReflectionClass($meta);
$prop = $rc->getProperty('services');
$prop->setAccessible(true);
$services = $prop->getValue($meta);
/** @var Di $di */
$di = $services['di'];
$services['di'] = new class($di, $test) extends Di {
public function __construct(Di $fallback, private readonly TestInterface $test)
{
parent::__construct($fallback);
}
public function injectDependencies(object $object, string $injectMethodName = self::DEFAULT_INJECT_METHOD_NAME, array $defaults = []): void
{
if ($object === $this->test) {
parent::injectDependencies(...func_get_args());
return;
}
// We check if the object is our test, if so we close mockery after.
codecept_debug(['CALLING',
get_class($object),
$injectMethodName
]);
try {
parent::injectDependencies(...func_get_args());
\Mockery::close();
} catch (\Throwable $t) {
\Mockery::resetContainer();
throw $t;
}
\Mockery::close();
}
};
$prop->setValue($meta, $services);
}
}
```
Essentially we hijack the `Di` container and replace it with a custom implementation. Based on the fact that for `Cest` files the actual test is ran like this:
```php
$this->getMetadata()->getService('di')->injectDependencies($this->testInstance, $methodName, $context);
```
We abuse this to insert a mockery closure after calling the test method.
While I'm happy to make a PR for this, I'm not sure it should be in an "official" repository. I probably don't have time to implement a proper fix where we add an event to allow modules to fail a test before it is finished.
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
Evaluación
Este issue todavía no se ha evaluado.