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
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.
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