web-dev-qa-db-ja.com

--code-coverageを指定して実行すると、Mockeryが「モックをロードできませんでした...クラスはすでに存在します」で失敗します

私はphpunitのクラスを模擬しようとしています。 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
11
Daniel Becker

このクラスをモックしている関数の前にこれらの注釈を追加する必要があります。

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

参考までに、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

私は同じ問題に遭遇し、このように修正しました:
1。私のモックしているクラスが含まれているphpファイルにrequire_onceがあるユニットテスト(モカリーテストではない)に別のテストがありました。その行を削除しました。
2。 testsuiteにprocessIsolation = "true"を追加しました

0
Vivek G