Codeception / Codeception/MockeryModule

Fully automate the module without requiring changes to tests

Open
#23 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
PHP
Stars
34
Forks
12
PR merge metrics
No merged PRs in 30d

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.

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.