在laravel 5中测试期间,如何模拟外部API?
我想在laravel中测试HTTP路由。URL的action函数调用一个helper函数,该函数调用一个外部API。测试时如何模拟外部API调用在laravel 5中测试期间,如何模拟外部API?,laravel,testing,laravel-5,Laravel,Testing,Laravel 5,我想在laravel中测试HTTP路由。URL的action函数调用一个helper函数,该函数调用一个外部API。测试时如何模拟外部API调用 public function actionFunction(){ $helper = new HelperClassHelper(); return Response::json($helper->getNames()); } 在这里,getNames()函数进行外部API调用。如何模拟它?您可以在操作中将Helpe
public function actionFunction(){
$helper = new HelperClassHelper();
return Response::json($helper->getNames());
}
在这里,getNames()函数进行外部API调用。如何模拟它?您可以在操作中将HelperClassHelper添加为依赖项,然后可以在测试中模拟它:
public function actionFunction(HelperClassHelper $helper){
return Response::json($helper->getNames());
}
$this->app->bind(HelperClassHelper::class, function () { /* return mock */ });
在测试中:
public function actionFunction(HelperClassHelper $helper){
return Response::json($helper->getNames());
}
$this->app->bind(HelperClassHelper::class, function () { /* return mock */ });
让我简单地说一下 按照以下步骤操作: 1.)添加服务
app/Services/MyService/HttpClient.php
。在本例中,我使用的是postman api
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"
}
谢谢你的回答。你能解释一下嘲弄的部分吗?我是第一次这样做,对我来说有点复杂。@SreekanthMK,当你向方法添加
HelperClassHelper
时,它是从容器中解析出来的(依赖项注入)。因此,在测试中,您可以执行$this->app->bind…
,这将用一个mock替换容器中的真实类;但仍然没有变化。