【发布时间】: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