web-dev-qa-db-fra.com

La moquerie échoue avec «Impossible de charger la maquette ... la classe existe déjà» lors de l'exécution avec --code-coverage

J'essaie de me moquer d'une classe pour phpunit. L'unité Php échoue avec l'erreur Could not load mock ... class already exists. C'est le seul test que j'exécute, donc il ne peut pas être le cas que la classe se moque déjà.

Toute suggestion serait appréciée.

Voici le cas d'erreur:

namespace Tests\Feature;

use Tests\TestCase;

class DeactivateACSTest extends TestCase
{
    public function testDeactivateAcs()
    {
        $deviceController = \Mockery::mock('overload:App\Http\Controllers\Cloud\DeviceController');
        $deviceController
            ->shouldReceive('deactivateACS')
            ->andReturn('hilfehilfehilfe');

        $devCon = new \App\Http\Controllers\Cloud\DeviceController();
        $this->assertEquals('hilfehilfehilfe', $devCon->deactivateACS());
    }
}

Lors de son exécution sans --code-coverage Ça marche:

[13:10:15] vagrant@Homestead [~/Code/ekp] $ phpunit --filter DeactivateACS
PHPUnit 6.5.10 by Sebastian Bergmann and contributors.


 ==> Tests\Feature\DeactivateACSTest              ✓

Time: 1.08 seconds, Memory: 16.00MB

OK (1 test, 3 assertions)

Cependant, lors de son exécution avec --code-coverage il échoue:

[13:10:23] vagrant@Homestead [~/Code/ekp] $ phpunit --coverage-html coverage --coverage-text=code_coverage.txt --filter DeactivateACSTest
PHPUnit 6.5.10 by Sebastian Bergmann and contributors.


  ==> Tests\Feature\DeactivateACSTest              ⚈

Time: 5.79 seconds, Memory: 44.00MB

There was 1 error:

1) Tests\Feature\DeactivateACSTest::testDeactivateAcs
Mockery\Exception\RuntimeException: Could not load mock \App\Http\Controllers\Cloud\DeviceController, class already exists

/home/vagrant/Code/ekp/vendor/mockery/mockery/library/Mockery/Container.php:220
/home/vagrant/Code/ekp/vendor/mockery/mockery/library/Mockery.php:116
/home/vagrant/Code/ekp/tests/Feature/DeactivateACSTest.php:11

ERRORS!
Tests: 1, Assertions: 0, Errors: 1.

Generating code coverage report in HTML format ... done
11
Daniel Becker

Vous devez ajouter ces annotations avant les fonctions qui se moquent de cette classe.

/**
 * @runInSeparateProcess
 * @preserveGlobalState disabled
 */

Pour référence, vous pouvez consulter la documentation de phpunit.

https://phpunit.de/manual/current/en/appendixes.annotations.html#appendixes.annotations.runInSeparateProcess

https://phpunit.de/manual/current/en/appendixes.annotations.html#appendixes.annotations.preserveGlobalState

16

J'ai rencontré le même problème et résolu comme ceci:
1. Il y avait un autre test dans mes tests unitaires (pas le test de moquerie) qui avait require_once sur le fichier php qui avait la classe que je moquais. Supprimé cette ligne.
2. ProcessIsolation = "true" ajouté dans la suite de tests

0
Vivek G