【问题标题】:Laravel: catch HTTP request on artisan command test case [duplicate]Laravel:在工匠命令测试用例上捕获 HTTP 请求 [重复]
【发布时间】:2021-09-27 01:32:22
【问题描述】:

我开发了一个 Laravel 控制台命令,可以向外部 API 发出 HTTP 请求。
在功能测试中,我想检查是否调用了正确的 URL。

问题是在功能测试中我无法捕捉到命令发出的请求。

下面是artisan命令的代码示例:

// ...
use Illuminate\Support\Facades\Http;

class SyncGamificationAccount extends Command
{
    // ...

    public function handle()
    {
        Http::get('http://example.com/api/some-endpoint');

        $this->info("Done :)");

        return 0;
    }

}

请在下面找到功能测试的代码:

use Illuminate\Support\Facades\Http;

// ...

    /** @test */
    public function the_command_console_should_make_the_request()
    {
        Http::fake();

        $resp = $this->artisan('users:update-from-api');

        $expectedUrl = 'http://example.com/api/some-endpoint';

        Http::assertSent(
            function ($request) use ($expectedUrl) {
                dd('not triggered at all');
                return $request->url() == $expectedUrl;
            }
        );
    }

当我运行测试时,我得到以下输出:

1) Tests\Feature\Console\UsersUpdateFromApiTest::the_command_console_should_make_the_request
An expected request was not recorded.
Failed asserting that false is true.

/srv/http/laravel-prj/vendor/laravel/framework/src/Illuminate/Http/Client/Factory.php:223
/srv/http/laravel-prj/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:261
/srv/http/laravel-prj/tests/Feature/Console/UsersUpdateFromApiTest.php:61

FAILURES!
Tests: 1, Assertions: 1, Failures: 1.

似乎Http::assertSent(...) 中的上述代码块根本没有被触发,因为没有拦截任何 API 请求;事实上,在运行测试时,没有显示 die 和 dump dd('not triggered at all');

我多次使用Http::fake();Http::assertSent,但对于控制台命令,它似乎无法正常工作。

请注意,当运行我的命令 php artisan users:update-from-api 时,它会正确发出请求。

非常感谢您的帮助!

【问题讨论】:

  • 请显示您的命令 - Http::fake 仅在您使用 Http 外观发出请求时才有效
  • 命令很长,我正在努力使其简短,我会尽快编辑问题。在功能测试和命令中,我使用 use Illuminate\Support\Facades\Http;
  • 刚刚更新 :) 感谢您的帮助
  • 我刚刚发现Http::assertSent 没有捕捉到请求。相反,Http::spy() 捕获了 http 请求……我不明白为什么……
  • 是的,这个问题是我提出的,如果您查看唯一答案的评论之一,我感谢答案的作者说 Http::spy() 帮助我解决了这个问题。我在解决方案下方发布。

标签: php laravel phpunit laravel-artisan


【解决方案1】:

经过反复尝试,发现Http::assertSent没有抓到请求;相反,Http::spy() 会捕获 http 请求。

注意:这仅发生在我的命令行测试中。

    /** @test */
    public function the_command_console_should_make_the_request()
    {
        Http::fake();

        $resp = $this->artisan('users:update-from-api');

        $expectedUrl = 'http://example.com/api/some-endpoint';

        Http::spy()
            ->expects('get')
            ->with($expectedUrl)
            ->once();
    }

【讨论】:

  • 请不要使用 cmets 的答案或要求更多。这里有一个建议:如果您回答之前的贡献(如果适用),这可能会吸引更多的吸引力。还在那里添加 cmets。
猜你喜欢
  • 1970-01-01
  • 2014-08-30
  • 2014-09-07
  • 2013-09-25
  • 2015-09-24
  • 2019-08-08
  • 2021-01-29
  • 2018-11-30
  • 2015-06-24
相关资源
最近更新 更多