1

他のテストクラスを拡張してPHPUnitで実行できるベーステストクラスを作成しています。このベース テスト クラスは、Laravel が提供するクラスを拡張しTestCaseます。また、PHP Faker ライブラリを使用してフェイカー ジェネレーターを作成しています。同様に、Laravel の Artisan ファサードを呼び出して、setUpメソッドでデータベースの移行を実行しています。. 最初は次のように見えました。

<?php
// BaseTester.php

use Artisan;
use Faker\Factory as Faker;

class BaseTester extends TestCase {

  protected $fake;

  function __construct() {
    $this->fake = Faker::create();
  }

  public function setUp()
  {
    parent::setUp();

    Artisan::call('migrate', [
      '--seed' => true,
    ]);
  }
}

初めて PHPUnit を実行したとき、成功しましたが、次の警告も表示されました。

PHP Warning: The use statement with non-compound name 'Artisan' has no effect in /Users/myusername/Sites/app/tests/BaseTester.php on line 3

わかりましたので、なぜそれが私にそれを与えるのだろうと思いました。だから私は削除しようとしました:

use Artisan;

クラスから、BaseTester.phpそれは機能し、すべてのテストに合格し、出力にも警告はありませんでした。

さて、なぜそのuse声明を削除しなければならなかったのか疑問に思いました。次に、自分のconfig/app.phpファイルに、Artisanファサードに使用できるエイリアスがあることを思い出しました。

...

'aliases' => [

        'App'       => Illuminate\Support\Facades\App::class,
        'Artisan'   => Illuminate\Support\Facades\Artisan::class,
        'Auth'      => Illuminate\Support\Facades\Auth::class,
...

そのため、自動的にロードする必要があります。config/app.phpつまり、ファイル内に Faker ファサードのエイリアスもある場合

...
/*
 * Third party libraries / packages aliases
 */
'Faker'     => Faker\Factory::class,
...

次に、それもロードする必要があるため、以下を含める必要はありません。

use Faker\Factory as Faker;

私のBaseTester.phpファイルで、そのFaker::create中のメソッドを呼び出すことができます。

そのため、そのステートメントも削除してusePHPUnit を実行しましたが、次のエラーが発生しました。

PHP Fatal error: Class 'Faker' not found in /Users/myusername/Sites/app/tests/BaseTester.php on line 12

エイリアスセクションの下のファイルに含まれている呼び出しは機能しますが、同じエイリアスセクションの下の同じファイルにも含まれている呼び出しは機能しないArtisanため、今は本当に混乱しています。config/app.phpFaker

最終的に、私のコードは次のようになります。

<?php
// BaseTester.php

use Faker\Factory as Faker;

class BaseTester extends TestCase {

  protected $fake;

  function __construct() {
    $this->fake = Faker::create();
  }

  public function setUp()
  {
    parent::setUp();

    Artisan::call('migrate', [
      '--seed' => true,
    ]);
  }
}

警告なしで動作しますが、エイリアス、名前空間、およびファサードに関して何が起こっているのか理解できません。これを理解するまで、Laravel がどのように機能するのかを本当に理解できないと感じています。

useエラーが発生しなくなるまで、他のコード ファイル内で Laravel ファサードとステートメントの適切な組み合わせを見つけようとするだけです。

4

0 に答える 0