PHPackages                             dobrosite/phpunit-psr-http-client - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Testing &amp; Quality](/categories/testing)
4. /
5. dobrosite/phpunit-psr-http-client

ActiveLibrary[Testing &amp; Quality](/categories/testing)

dobrosite/phpunit-psr-http-client
=================================

Инструменты для тестирования кода, использующего PSR-18

1.1.0(1y ago)05.4kMITPHPPHP ^8.0

Since Aug 5Pushed 1y ago1 watchersCompare

[ Source](https://github.com/dobrosite/phpunit-psr-http-client)[ Packagist](https://packagist.org/packages/dobrosite/phpunit-psr-http-client)[ RSS](/packages/dobrosite-phpunit-psr-http-client/feed)WikiDiscussions master Synced today

READMEChangelog (2)Dependencies (14)Versions (5)Used By (0)

Инструменты для тестирования кода, использующего PSR-18
=======================================================

[](#инструменты-для-тестирования-кода-использующего-psr-18)

Это расширение для [PHPUnit](https://phpunit.de/) позволяет в интеграционных и функциональных (прикладных) тестах задавать ожидания для запросов, выполняемых с помощью клиентов HTTP, совместимых с [PSR-18](https://php-fig.org/psr/psr-18/).

Пример:

```
$this->getHttpClient()
    ->expectRequest('POST', 'https://example.com/api/v1/users')
    ->headers([
        'accept' => 'application/vnd.api+json',
        'content-type' => 'application/vnd.api+json',
    ])
    ->body([
        'data' => [
            'type' => 'users',
            'attributes' => [
                'email' => 'user@example.com',
            ],
        ],
    ])
    ->willReturn(
        [
            'errors' => [
                [
                    'code' => 'EmailAlreadyRegistered',
                    'title' => 'Адрес электронной почты уже заргистрирован',
                ],
            ],
        ],
        422,
        [
            'content-type' => 'application/vnd.api+json',
        ]
    );
```

Установка
---------

[](#установка)

```
composer require --dev dobrosite/phpunit-psr-http-client

```

Подключение
-----------

[](#подключение)

В тестовой конфигурации вашего приложения вам надо подменить используемую реализацию `Psr\Http\Client\ClientInterface` экземпляром `DobroSite\PHPUnit\PSR18\TestHttpClient`. Как это сделать, зависит от устройства вашего приложения, ниже даны примеры для популярных фреймворков.

### Symfony

[](#symfony)

В конфигурацию тестового контейнера зависимостей (обычно — `config/services_test.yaml`) добавьте:

```
services:

  Psr\Http\Client\ClientInterface:
    class: DobroSite\PHPUnit\PSR18\TestHttpClient
    public: true
```

Теперь в тесты, унаследованные от `Symfony\Bundle\FrameworkBundle\Test\KernelTestCase`, добавьте примесь `DobroSite\PHPUnit\PSR18\Symfony\TestHttpClientTrait`:

```
use DobroSite\PHPUnit\PSR18\Symfony\TestHttpClientTrait;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

final class SomeTest extends WebTestCase
{
    use TestHttpClientTrait;

    public function testSomething(): void
    {
        // Подготовка.

        $this->getHttpClient()
            ->expectRequest('GET', 'https://some.service/some/resource')
            ->willReturn([
                'data' => [/* Имитация ответа сторонней службы. */],
            ]);

        // Действие.

        $client = static::createClient();
        $crawler = $client->request('GET', '/api/foo');

        // Проверки.

        $this->assertResponseIsSuccessful();
    }
}
```

Как это работает
----------------

[](#как-это-работает)

Предположим, у вас есть класс `Foo`, обращающийся к стороннему API `https://example.com/api`. Для этого класс пользуется клиентом HTTP, совместимым с PSR-18:

```
use Psr\Http\Client\ClientInterface;

class Foo
{
    public function __construct(
        private readonly ClientInterface $httpClient,
    ) {
    }

    public function doSomething(): Something
    {
        // …
        $response = $this->httpClient->sendRequest($request);
        // …
    }
}
```

В тестах в конструктор этого класса будет передан экземпляр `TestHttpClient`, который будет имитировать обмен данными с удалённым сервером без реального выполнения запросов.

Использование
-------------

[](#использование)

Перед выполнением проверяемого действия надо настроить `TestHttpClient` — указать, какие запросы должен выполнить тестируемый код и какие ответы на них надо дать.

### expectRequest

[](#expectrequest)

Для каждого ожидаемого запроса надо вызвать метод `TestHttpClient::expectRequest()`, принимающий два аргумента — $method и $uri — каждый из которых может быть как строкой, так и экземпляром `PHPUnit\Framework\Constraint\Constraint`. Если проверяемый код сделает запрос HTTP, метод или URI которого не соответствуют ожиданиям (или вообще не сделает запрос), тест провалится.

```
$this->getHttpClient()->expectRequest('GET', 'https://some.service/some/resource')
```

Ожидается запрос методом `GET` на URI `https://some.service/some/resource`.

```
$this->getHttpClient()->expectRequest(new IsAnything(), new StringStartsWith('https://example.com/'))
// или
$this->getHttpClient()->expectRequest(self::anything(), self::stringStartsWith('https://example.com/'))
```

Ожидается запрос любим методом на URI начинающийся с `https://example.com/`.

### headers

[](#headers)

Метод `headers` позволяет задать ожидания для заголовков запроса, который должен выполнить проверяемый код. Единственный аргумент метода должен содержать ассоциативный массив, ключи которого — имена заголовков (регистр не имеет значения), а значения — ожидаемые значения этих заголовков. В качестве значений можно использовать как строки, таки экземпляры `Constraint`.

```
$this->getHttpClient()->expectRequest(/* … */)->headers([
    'Accept' => self::stringContains('application/json'),
    'content-type' => 'application/json',
]);
```

### body

[](#body)

Метод `body` задаёт ожидание для тела запроса. В аргументе `$bodyConstraint` метод может принимать:

- строку — будет интерпретирована как `new IsEqual($bodyConstraint)`;
- массив — будет интерпретирован как `new JsonMatches(json_encode($bodyConstraint))`;
- экземпляр `Constraint`.

```
$this->getHttpClient()->expectRequest(/* … */)->body('{"foo":"bar"}');
$this->getHttpClient()->expectRequest(/* … */)->body(['foo' => 'bar']);
$this->getHttpClient()->expectRequest(/* … */)->body(self::stringContains('bar'));
```

### willReturn

[](#willreturn)

Метод `willReturn` позволяет задать ответ, который получит проверяемый код в ответ на ожидаемый запрос. У метода 3 аргумента.

- `$body` — тело ответа. Может быть:
    - экземпляром `StreamInterface` — будет возвращено как есть;
    - строкой или ресурсом — будет преобразовано к `StreamInterface`;
    - массивом — будет преобразовано в JSON;
    - `null` — в ответе не будет тела.
- `$statusCode` — код состояния HTTP;
- `$headers` — заголовки ответа. Ассоциативный массив «заголовок =&gt; значение». Регистр имён не имеет значения.

```
$this->getHttpClient()->expectRequest(/* … */)->willReturn(
    body: '{"foo":"bar"}',
    statusCode: 200,
);
$this->getHttpClient()->expectRequest(/* … */)->willReturn(
    body: null,
    statusCode: 204,
    headers: ['ETag' => 'viChieyiupaidahng6eiv3bohRohcohb']
);
```

### willThrowException

[](#willthrowexception)

Выбросит переданное методу исключение.

```
$this->getHttpClient()->expectRequest(/* … */)->willThrowException(new SomeException(/* … */));
```

###  Health Score

32

—

LowBetter than 69% of packages

Maintenance36

Infrequent updates — may be unmaintained

Popularity18

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity56

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~279 days

Total

4

Last Release

588d ago

Major Versions

0.2.0 → 1.0.02024-11-08

### Community

Maintainers

![](https://www.gravatar.com/avatar/f59cdbde66f36f1f86dad783d2f79e64c17ffdcd0771f73b96b7d9d7ee37b364?d=identicon)[Mekras](/maintainers/Mekras)

---

Top Contributors

[![mekras](https://avatars.githubusercontent.com/u/192067?v=4)](https://github.com/mekras "mekras (24 commits)")

---

Tags

phpunitpsr-18

###  Code Quality

Static AnalysisPHPStan, Rector

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/dobrosite-phpunit-psr-http-client/health.svg)

```
[![Health](https://phpackages.com/badges/dobrosite-phpunit-psr-http-client/health.svg)](https://phpackages.com/packages/dobrosite-phpunit-psr-http-client)
```

###  Alternatives

[brianium/paratest

Parallel testing for PHP

2.5k136.1M984](/packages/brianium-paratest)[mollie/mollie-api-php

Mollie API client library for PHP. Mollie is a European Payment Service provider and offers international payment methods such as Mastercard, VISA, American Express and PayPal, and local payment methods such as iDEAL, Bancontact, SOFORT Banking, SEPA direct debit, Belfius Direct Net, KBC Payment Button and various gift cards such as Podiumcadeaukaart and fashioncheque.

60216.0M83](/packages/mollie-mollie-api-php)[drupal/core-dev

require-dev dependencies from drupal/drupal; use in addition to drupal/core-recommended to run tests from drupal/core.

2022.6M341](/packages/drupal-core-dev)[telnyx/telnyx-php

Official Telnyx PHP SDK — APIs for Voice, SMS, MMS, WhatsApp, Fax, SIP Trunking, Wireless IoT, Call Control, and more. Build global communications on Telnyx's private carrier-grade network.

35789.4k2](/packages/telnyx-telnyx-php)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
