首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在laravel 5中模拟外部API?

问如何在laravel 5中模拟外部API?
EN

Stack Overflow用户
提问于 2018-09-13 08:30:43
回答 2查看 4.1K关注 0票数 2

我想用laravel测试HTTP路由。URL的操作函数调用一个助手函数,该函数调用外部API。如何在测试时模拟外部API调用?

代码语言:javascript
复制
public function actionFunction(){

     $helper = new HelperClassHelper();

     return Response::json($helper->getNames());

}

在这里,getNames()函数进行外部API调用。我怎么能嘲笑它呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-13 08:34:06

您可以在操作中将HelperClassHelper作为依赖项添加,然后可以在测试中对其进行模拟:

代码语言:javascript
复制
public function actionFunction(HelperClassHelper $helper){
     return Response::json($helper->getNames());
}

在测试中:

代码语言:javascript
复制
$this->app->bind(HelperClassHelper::class, function () { /* return mock */ });
票数 4
EN

Stack Overflow用户

发布于 2020-06-03 17:47:28

让我把这个简单一点。

按照这一步骤:

1.)添加服务app/Services/MyService/HttpClient.php。在这种情况下,我使用postman。

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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:

代码语言:javascript
复制
{
    "mock" : "yes"
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52309653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档