我想用laravel测试HTTP路由。URL的操作函数调用一个助手函数,该函数调用外部API。如何在测试时模拟外部API调用?
public function actionFunction(){
$helper = new HelperClassHelper();
return Response::json($helper->getNames());
}在这里,getNames()函数进行外部API调用。我怎么能嘲笑它呢?
发布于 2018-09-13 08:34:06
您可以在操作中将HelperClassHelper作为依赖项添加,然后可以在测试中对其进行模拟:
public function actionFunction(HelperClassHelper $helper){
return Response::json($helper->getNames());
}在测试中:
$this->app->bind(HelperClassHelper::class, function () { /* return mock */ });发布于 2020-06-03 17:47:28
让我把这个简单一点。
按照这一步骤:
1.)添加服务app/Services/MyService/HttpClient.php。在这种情况下,我使用postman。
namespace App\Services\MyService;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Response;
class HttpClient
{
public function send(array $payload) : Response
{
return app(Client::class)
->request('POST', 'https://postman-echo.com/post', $payload);
}
}2.)添加控制器app/Http/Controllers/TestController.php
namespace App\Http\Controllers;
use App\Services\MyService\HttpClient;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
class TestController extends Controller
{
public function index(Request $request)
{
$response = app(HttpClient::class)->send($request->toArray());
$data = json_decode( $response->getBody()->getContents(),true);
return response()->json(
$data,
$response->getStatusCode()
);
}
}3.)添加测试文件tests/Feature/SampleTest.php
namespace Tests\Feature;
use App\Services\MyService\HttpClient;
use GuzzleHttp\Psr7\Response;
use Illuminate\Support\Facades\File;
use Tests\TestCase;
class SampleTest extends TestCase
{
public function setUp(): void
{
parent::setUp();
//do awesome thing
}
public function testExample()
{
$this->mock(HttpClient::class, function ($mock) {
return $mock->shouldReceive('send')
->once()
->andReturn(new Response(
$status = 200,
$headers = [],
File::get(base_path('tests/files/success.json'))
));
});
$data = [
'mock' => 'no'
];
$response = $this->call('post','/test', $data);
$response->assertExactJson(['mock' => 'yes']);
$response->assertStatus(200);
}
}4.)添加用于假响应的json文件tests/files/success.json:
{
"mock" : "yes"
}https://stackoverflow.com/questions/52309653
复制相似问题