我正在创建基本测试类,其他测试类可以从中扩展并使用 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 外观组合,直到没有错误为止。