Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在laravel 5中测试期间,如何模拟外部API?_Laravel_Testing_Laravel 5 - Fatal编程技术网

在laravel 5中测试期间,如何模拟外部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

我想在laravel中测试HTTP路由。URL的action函数调用一个helper函数,该函数调用一个外部API。测试时如何模拟外部API调用

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替换容器中的真实类;但仍然没有变化。