Fully automate the module without requiring changes to tests
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 25/100
Rechercherichtung
Beginne mit dem _before(TestInterface $test)-Einstiegspunkt des Moduls und dem im Issue gezeigten Codeception Di::injectDependencies-Aufruf. Verfolge, wie Cest und andere Testtypen ausgeführt werden, und definiere anschließend den benötigten Lifecycle-Hook, um die Mockery-Bereinigung ohne Änderungen an den Tests auszuführen. Die Arbeit ist abgeschlossen, wenn das Modul über die unterstützten Testtypen hinweg funktioniert und die Bereinigung sowie die Fehlerbehandlung abgedeckt sind.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
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.
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:
$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.
- Vorherrschende Sprache
- PHP
- Sterne
- 34
- Forks
- 12
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beitragsleitfaden
Für dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus Codeception/MockeryModule
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
Codeception/MockeryModule#14 · 1 Reaktion ·
Alle Issues in Codeception/MockeryModule
Ähnliche Issues
-
Solved site promotion gate fails on runner PHP patch drift (expects 8.2.33, runner installs 8.2.34) Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
Automattic/blocks-engine#2161 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Automattic/static-site-importer#1824 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
-
0. Needs triage bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
-
0. Needs triage 35-feedback bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100