Codeception / Codeception/MockeryModule

Fully automate the module without requiring changes to tests

Ouverte
#23 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
PHP
Étoiles
34
Forks
12
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

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.

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.