Какой правильный подход к тестированию php клиента работающего через стороннее API?

Описание системы
Есть сторонее API, через которое работает PHP приложение. Представьте самый обычный проект на PHP, только вместо своей базы данных используется стороннее API.

Коротко об архитектуре
Архитектура делится на несколько слоев, самый низший слой это Request, который получает данные из API. Условно 2-м слоем я назову View Model (некий класс с геттерами), которые возвращает Request. Следующие слои это Presenter и Repository.

Цикл работы
К примеру конструктор дергает Repository внутри которого Request получает необходимый View Model и заварачивает его в Presenter.

Для справки: Presenter - некая обертка для View Model, с целью изменения методов (разновидность декоратора)

Данные для тестирования
Так-как наш клиент практически не обладает бизнес логикой, все тесты будут сводится к тому, чтобы гарантировать правильное получение и рендер данных. При этом, клиент не обладает своей базой данных, поэтому все возможные результаты отдачи от API будут подготовлены заранее в json файлах.

Задача
Протестировать все слои таким образом, чтобы гарантировать правильную работу клиента с попавшими в него данными.

Подход
На примере модуля Content я попробую описать свои мысли относительно тестирования этого добра.

ContentRequestTest.php
Первое, что мы попробуем протестировать, это то, что Request действительно возвращает нужную нам View Model.
public function test_request_getRecord(): void
    {
        $responseDataArray = $this->getArrayFromJsonFile('content/Record.json');
        $contentRequest = new ContentRequestMock($responseDataArray['data'], [], 200);

        $record = $contentRequest->getRecord();
        $this->assertInstanceOf(Record::class, $record);
    }


ContentViewPresenterTest.php
Далее мы протестируем Presenter. Непосредственно Presenter спускается в виды, поэтому необходимо проверить каждое его поле.
public function test_RecordPresenter(): void
    {
        $responseDataArray = $this->getArrayFromJsonFile('content/Record.json');
        $contentRequest = new ContentRequestMock($responseDataArray['data'], [], 200);

        $presenter = new RecordPresenter($contentRequest->getRecord());

        $this->assertInternalType('string', $presenter->getDate());
        $this->assertInternalType('string', $presenter->getLabel());
        $this->assertInternalType('string', $presenter->getCategory());

        $this->assertEquals($presenter->getUrl(), route('journal.show', ['alias' => 'record-alias']));
        $this->assertEquals($presenter->getPreviewDefaultImage(), 'preview_url_1.jpeg');
        $this->assertEquals($presenter->getReviewDefaultImage(), 'preview_url_1.jpeg');
        $this->assertEquals($presenter->getTitle(), 'title');
        $this->assertEquals($presenter->getShortText(), 'text_short');
        $this->assertEquals($presenter->getFullText(), 'text_full');
    }


ContentRepositoryTest.php
И на послед, мы проверим Repository. Действительно ли он возвращает нам нужный Repository
public function test_repository_getRecord(): void
    {
        $contentRepository = $this->buildRepositoryFromJsonFile('content/Record.json');
        $record = $contentRepository->getRecord('record-alias');

        $this->assertInstanceOf(ContentRepository::class, $contentRepository);
        $this->assertInstanceOf(ContentRepositoryContract::class, $contentRepository);

        $this->assertInstanceOf(RecordPresenter::class, $record);
        $this->assertInstanceOf(RecordPresenterContract::class, $record);
    }


ВОПРОСЫ
1. - Правильный ли подход к тестированию я выбрал ?
2. - Тесты не зависимы и могут выполнятся в любом порядке, однако из-за этого приходится делать одинаковые операции в каждом тесте по подключении моков, есть ли смысл впихнуть это все в 1 файл, а не разбивать на 3 ?
  • Вопрос задан
  • 440 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 03:01
1000 руб./за проект
18 апр. 2024, в 21:56
2000 руб./за проект
18 апр. 2024, в 21:00
150 руб./за проект