解决 Laravel 单元测试报错:A facade root has not been set

2022-03-03 09:50:55 浏览数 (2)

在使用 Laravel 写单元测试时,直接复制了默认的文件:tests/Unit/ExampleTest.php

而在测试对象中使用到了 Facades 相关的语法,执行phpunit时报错:

代码语言:javascript复制
RuntimeException: A facade root has not been set.

/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:258

此问题的原因是继承了错误的基类,默认文件tests/Unit/ExampleTest.php中:

代码语言:javascript复制
namespace TestsUnit;

use PHPUnitFrameworkTestCase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $this->assertTrue(true);
    }
}

继承的是PHPUnitFrameworkTestCase,而我们应该继承tests/TestCase.php中的TestsTestCase

代码语言:javascript复制
namespace Tests;

use IlluminateFoundationTestingTestCase as BaseTestCase;

abstract class TestCase extends BaseTestCase
{
    use CreatesApplication;
}

实际上应该复制 tests/Feature/ExampleTest.php 作为模板文件,就不会遇到这个问题了。

除了复制之外,也可以直接在命令行中直接运行:

代码语言:javascript复制
php artisan make:test FooTest

将会为你创建tests/Feature/FooTest.php文件,而加上--unit参数,则是在tests/Unit中创建文件。

代码语言:javascript复制
php artisan make:test BarTest --unit

0 人点赞