Php单元失败,出现错误Could not load mock ... class already exists。这是我正在运行的唯一一个测试,所以它不可能是类已经被模仿的情况。
任何建议都将不胜感激。
下面是错误案例:
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());
}
}在不使用--code-coverage的情况下运行时,它可以工作:
[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)但是,当使用--code-coverage运行它时,它会失败:
[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发布于 2018-11-13 01:11:13
您应该在模拟该类的函数之前添加这些注释。
/**
* @runInSeparateProcess
* @preserveGlobalState disabled
*/作为参考,您可以查看phpunit文档。
发布于 2019-08-09 00:57:19
我遇到了同样的问题,修复方法如下:
在我的单元测试(不是模拟测试)中有另一个测试(不是模拟测试),它对包含我正在模拟的类的文件进行了require_once。我已经删除了这一行,我已经在测试套件中添加了processIsolation="true"
https://stackoverflow.com/questions/51708289
复制相似问题