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 1mo ago

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 72% of packages

Maintenance38

Infrequent updates — may be unmaintained

Popularity18

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity55

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

538d 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.5k118.8M754](/packages/brianium-paratest)[johnkary/phpunit-speedtrap

Find and report on slow tests in your PHPUnit test suite

78137.2M122](/packages/johnkary-phpunit-speedtrap)[spatie/phpunit-snapshot-assertions

Snapshot testing with PHPUnit

69417.9M510](/packages/spatie-phpunit-snapshot-assertions)[phpspec/prophecy-phpunit

Integrating the Prophecy mocking library in PHPUnit test cases

19254.9M1.4k](/packages/phpspec-prophecy-phpunit)[yoast/phpunit-polyfills

Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests

18338.5M841](/packages/yoast-phpunit-polyfills)[ergebnis/phpunit-slow-test-detector

Provides facilities for detecting slow tests in phpunit/phpunit.

1468.1M72](/packages/ergebnis-phpunit-slow-test-detector)

PHPackages © 2026

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