调用模型方法时,Artisan 输出在测试中不起作用

问题描述 投票:0回答:1

我正在尝试将一个新命令添加到围绕现有模型的一组现有命令中。

围绕此的其他命令的其他测试都按预期正常工作。

但是,一旦我在

Artisan::output()
模型上添加任何方法调用,这个新测试 + 命令就会停止写入
Webhook
count()
first()
all()
。没关系,如果我将它分配给一个变量或至少使用它也没关系。没有异常,没有 PHP/Laravel 日志错误。当直接从 bash artisan 调用时,完全相同的命令可以完美地工作。这是我见过的最奇怪的事情。

测试:

<?php

namespace Tests\Unit\Console\Commands\Webhook\Customer;

use App\Models\Shopify\Webhook;
use Illuminate\Support\Facades\Artisan;
use Tests\TestCase;

class ProcessUpdateWebhooksTest extends TestCase
{
    /** @test */
    public function thisWorksRightHere()
    {
        Artisan::call('boxer:process-customer-update-webhooks');

        $this->assertStringContainsString(
            'Hey',
            Artisan::output()
        );
    }
}

命令(注释

Webhook::count()
则通过,否则命令的输出为
''
',则失败。

<?php

namespace App\Console\Commands\Webhook\Customer;

use App\Models\Shopify\Webhook;
use Illuminate\Console\Command;

class ProcessUpdateWebhooks extends Command
{
    protected $signature = 'boxer:process-customer-update-webhooks
        {--w|webhooks=25 : The maximum number of webhooks to process}';

    protected $description = 'Process orders/create webhooks from Shopify (default 25)';

    public function handle()
    {
        Webhook::count();
        $this->info('Hey');
    }
}

phpunit.xml 部分:

    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <!-- <env name="DB_DATABASE" value="testing"/> -->
        <env name="MAIL_MAILER" value="array"/>
        <env name="QUEUE_CONNECTION" value="sync"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="TELESCOPE_ENABLED" value="false"/>
    </php>

测试输出:

PHPUnit 9.6.19 by Sebastian Bergmann and contributors.

F                                                                   1 / 1 (100%)

Time: 00:02.211, Memory: 48.50 MB

There was 1 failure:

1) Tests\Unit\Console\Commands\Webhook\Customer\ProcessUpdateWebhooksTest::thisWorksRightHere
Failed asserting that '' contains "Hey".

/Users/peterdemarco/code/projects/boxer/tests/Unit/Console/Commands/Webhook/Customer/ProcessUpdateWebhooksTest.php:16
/Users/peterdemarco/code/projects/boxer/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestCase.php:61

所有其他测试(同样,包括此模型和使用此模型的命令的所有其他测试)工作完全正常。

我错过了什么??

laravel phpunit
1个回答
0
投票

发生这种情况可能是因为您没有使用

$this->artisan
来测试命令。所以其他东西可能不会设置,因为它在测试模式下运行。

将您的测试切换到正确的方式:

<?php

namespace Tests\Unit\Console\Commands\Webhook\Customer;

use App\Models\Shopify\Webhook;
use Illuminate\Support\Facades\Artisan;
use Tests\TestCase;

class ProcessUpdateWebhooksTest extends TestCase
{
    /** @test */
    public function thisWorksRightHere()
    {
        $this->artisan('boxer:process-customer-update-webhooks')
            ->expectsOutputToContain('Hey');
    }
}

将任何断言链接到

artisan()
调用非常重要。如果您不这样做,该命令将在预期之前运行,请严格谈论该命令来链接您的断言。

© www.soinside.com 2019 - 2024. All rights reserved.