【问题标题】:Why Laravel tests created with make:test extends from a different TestCase when the --unit flag is used为什么使用 make:test 创建的 Laravel 测试在使用 --unit 标志时从不同的 TestCase 扩展
【发布时间】:2020-05-22 17:58:12
【问题描述】:

使用 Laravel,你可以使用 Artisan 来制作一个测试类,使用 php artisan make:test 命令。 或者,--unit 标志可用于创建单元测试而不是功能测试。

我最近不得不编写一个单元测试,在执行之前需要进行一些设置。 不幸的是,我在尝试使用外观时遇到了错误:A facade root has not been set

经过一番挖掘,我看到使用--unit 标志生成的测试类从PHPUnit\Framework\TestCase 扩展而来,而功能测试从Tests\TestCase 扩展而来。这就是为什么我无法使用外观,使用--unit 生成的测试类时应用程序无法启动。

有人知道为什么要这样设计吗?

【问题讨论】:

    标签: laravel phpunit laravel-artisan


    【解决方案1】:

    更新:

    php artisan make:test

    这个命令会生成一个Feature测试。功能测试通常用于测试协作类的集成。

    php artisan make:test --unit

    此命令生成一个单元 测试。单元测试通常是测试代码单元,例如类或类中的方法。单元测试将用 Mocks 或其他测试替身替换任何依赖项,以便单独测试类/函数。


    通常,您可能希望在单元测试中“模拟”外观。以下是来自Laravel Documentation的相关信息:

    在测试 Laravel 应用程序时,您可能希望“模拟”应用程序的某些方面,这样它们就不会在给定的测试期间实际执行。例如,在测试调度事件的控制器时,您可能希望模拟事件侦听器,以便它们在测试期间不会实际执行。这允许您只测试控制器的 HTTP 响应,而不必担心事件侦听器的执行,因为事件侦听器可以在自己的测试用例中进行测试。

    另外,here is documentation 模拟 Cache 外观(例如):

    我们可以使用 shouldReceive 方法来模拟对 Cache 门面的调用,该方法将返回一个 Mockery 模拟的实例。由于门面实际上是由 Laravel 服务容器解析和管理的,因此它们比典型的静态类具有更多的可测试性。例如,让我们模拟我们对 Cache 门面的 get 方法的调用:

    namespace Tests\Feature;
    
    use Illuminate\Foundation\Testing\RefreshDatabase;
    use Illuminate\Foundation\Testing\WithoutMiddleware;
    use Illuminate\Support\Facades\Cache;
    use Tests\TestCase;
    
    class UserControllerTest extends TestCase
    {
        public function testGetIndex()
        {
            Cache::shouldReceive('get')
                        ->once()
                        ->with('key')
                        ->andReturn('value');
    
            $response = $this->get('/users');
    
            // ...
        }
    }
    

    【讨论】:

    • 这很有趣,但不幸的是它并没有真正回答我的问题,即“为什么php artisan make:test --unit 产生一个从PHPUnit\Framework\TestCase 扩展的类,而php artisan make:test 产生一个从@987654330 扩展的类@ ?
    • @toyi:请参阅上面的更新答案。也许额外的解释会有所帮助?
    猜你喜欢
    • 2021-07-06
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多