1

我正在创建基本测试类,其他测试类可以从中扩展并使用 PHPUnit 运行。这个基础测试类扩展了 Laravel 提供的TestCase类。另外,我正在使用PHP Faker 库来创建一个 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方法。

所以我也删除了该use语句并运行 PHPUnit,但随后出现此错误:

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

所以现在我真的很困惑,因为别名部分下Artisan的文件中包含的调用有效,但同一别名部分下的同一文件中也包含config/app.php的调用无效。Faker

最后,我的代码如下所示,

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