@kaxa3201

Как правильно писать phpunit тесты?

Учусь писать phpunit тесты , хочу попробовать на имеющемся коде написать тест
мой код
<?php
class ContentService implements ContentServiceInterface
{
    private $client;

    /**
     * ContentServiceInterface constructor.
     * @param Client $client
     */
    public function __construct(Client $client)
    {
        $this->client = $client;
    }

    /**
     * @param $query
     * @return mixed
     */
    public function getContent($query): ?string
    {
        $queryEncode = urlencode($query);

        if ($result = $this->loadFromCache($queryEncode)) {
            return $result['content'];
        }

        return null;
    }

    public function sqrt($x)
    {
        return sqrt($x);
    }

}

вот мой тест пробный
<?php

namespace Tests\Feature;

use App\Services\ContentService;
use GuzzleHttp\Client;
use Tests\TestCase;

class ContentServiceTest extends TestCase
{
    public $client;

    public function __construct()
    {
        parent:: __construct();


    }


    public function testsqrt($client): void
    {
        $o = new ContentService($client);
        $this->assertEquals(4, $o->sqrt(16));
    }
}

Получаю ошибку
ArgumentCountError: Too few arguments to function Tests\Feature\ContentServiceTest::testsqrt(), 0 passed
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
Shark13
@Shark13
Корректный тест для данного кода:
<?php

namespace Tests\Feature;

use App\Services\ContentService;
use GuzzleHttp\Client;
use Tests\TestCase;

class ContentServiceTest extends TestCase
{
    public function testSqrt(): void
    {
        $client = new Client();
        $o = new ContentService($client);
        $this->assertEquals(4, $o->sqrt(16));
    }
}


Также желательно указывать аннотации в тестах, для точного сопоставления того что тестируется. Если не указать аннотации, то при построении отчета по code coverage будут учтены не только тестируемые методы, а вообще все вызовы, что использовались в рамках тестирования
<?php

namespace Tests\Feature;

use App\Services\ContentService;
use GuzzleHttp\Client;
use Tests\TestCase;

/**
 * @coversDefaultClass \App\Services\ContentService
 */
class ContentServiceTest extends TestCase
{
    /**
     * @covers ::sqrt
     */
    public function testSqrt(): void
    {
        $client = new Client();
        $o = new ContentService($client);
        $this->assertEquals(4, $o->sqrt(16));
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
GTRxShock
@GTRxShock
Full-stack developer (Symfony, Angular)
ну как бы
Too few arguments to function Tests\Feature\ContentServiceTest::testsqrt(), 0 passed

и этим все сказано)

кто за вас инжектить будет клиента в тест?
public function testsqrt($client): void
Ответ написан
@oxidmod
откуда возьмется $client в аргументах тестового метода?
Ответ написан
<?php

namespace Tests\Feature;

use App\Services\ContentService;
use GuzzleHttp\Client;
use Tests\TestCase;

class ContentServiceTest extends TestCase
{
    public function testsqrt(): void
    {
        $config = [];
        $client = new GuzzleHttp\Client($config);
        $o = new ContentService($client);
        $this->assertEquals(4, $o->sqrt(16));
    }
}


Если $client будет использоваться ещё где то в тестовом классе, вынести его инициализацию.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы