Вызов функции-члена expectedOutput () для целого числа при тестировании кустарной консольной команды - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть очень простой пример, чтобы показать проблему:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class VendorCounts extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'vendor:counts
                            {year : The year of vendor counts}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Runs vendor counts';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->info('Starting Vendor Counts');
    }
}
<?php

namespace Tests\Feature\Console\Vendor;

use Tests\TestCase;

class VendorCountsTest extends TestCase {

    public function testVendorCounts()
    {
        $this->artisan('vendor:counts', ['year' => 2019])
             ->expectsOutput('Starting Vendor Counts')
             ->assertExitCode(0);
    }
}

Я получаю следующую ошибку:

1) Tests\Feature\Console\Vendor\VendorCountsTest::testVendorCounts
Error: Call to a member function expectsOutput() on integer

/Users/albertski/Sites/vrs/tests/Feature/Console/Vendor/VendorCountsTest.php:12

Я знаю, что команда определенно выполняется, потому что если япоместите в него оператор дампа, чтобы увидеть выходные данные отладки.

Я использую Laravel 6.3. Есть ли другой способ проверить это?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2019

Проблема, которую я использовал, состояла в том, что TestCase использовал Laravel\BrowserKitTesting\TestCase как BaseTestCase. В итоге я создал еще одну базу только для консольных команд.

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

abstract class ConsoleTestCase extends BaseTestCase
{
    use CreatesApplication;
}
0 голосов
/ 05 ноября 2019

Можете ли вы добавить это к вашему VendorCountsTest классу:

public $mockConsoleOutput = true;

Это задается чертой, но просто убедитесь, что что-то не изменило значение. Когда $mockConsoleOutput равно false, он напрямую запускает команду ремесленника. Когда он равен true, он обернет его в PendingCommand объект, в котором есть те методы, которые вы пытаетесь вызвать.

...