Как я могу имитировать внешний API во время тестирования в laravel 5?

Я хочу протестировать HTTP-маршрут в laravel. Функция действия URL-адреса вызывает вспомогательную функцию, которая вызывает внешний API. Как я могу имитировать внешний вызов API во время тестирования?

public function actionFunction(){

     $helper = new HelperClassHelper();

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

}

Здесь функция getNames () выполняет внешний вызов API. Как мне поиздеваться?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
2 742
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете добавить HelperClassHelper в качестве зависимости в действие, и тогда вы сможете имитировать его в тесте:

public function actionFunction(HelperClassHelper $helper){
     return Response::json($helper->getNames());
}

В тесте:

$this->app->bind(HelperClassHelper::class, function () { /* return mock */ });

Спасибо за ответ. Не могли бы вы объяснить и насмешливую часть? Я делаю это впервые и для меня это немного сложно.

Sreekanth MK 13.09.2018 12:51

@SreekanthMK, когда вы добавляете HelperClassHelper в метод, он разрешается из контейнера (внедрение зависимостей). Итак, в тесте вы можете использовать $this->app->bind..., который заменит настоящий класс в контейнере на макет.

thefallen 13.09.2018 13:28

Я добавил это в тест, $ this-> app-> bind (InfusionsoftHelper :: class, function () {return "this is a mock";}); Но все равно никаких изменений.

Sreekanth MK 13.09.2018 13:46

позвольте мне сделать это просто.

выполните этот шаг:

1.) добавить сервис app/Services/MyService/HttpClient.php. в этом случае я использую 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"
}

Другие вопросы по теме