2017-01-27 2 views
1

Я пытаюсь написать тесты интеграции для своих репозиториев. Для простых репозиториев это кажется легким. Я сделал что-то вроде этогоКак правильно протестировать репозитории php

class DBStatusRepositoryTest extends SmBaseIntegrationMemory 
{ 
    private $dbStatusRepository; 

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

     $this->dbStatusRepository = new DBStatusRepository($this->dbConnection); 
    } 

    public function testShouldReturnAStatusEntity() 
    { 
     $status = $this->dbStatusRepository->getById(1); 
     $this->assertInstanceOf('Acme\Modules\Foo\Model\Status', $status); 
    } 
} 

Выполнение запроса в репозитории статуса должно возвращать объект состояния.

Но я не знаю, как подойти к более сложных репозиториев, как это:

public function testAddAttachment() 
{ 
    $itemId = 420807; 
    $user = new User([//** data ** //]; 
    $attachment = new Attachment(); 
    $attachment->setUser($user); 
    $attachment->setSomething('something'); 
    $attachment->set....; 

    $this->dbAttachmentRepository->addAttachmentForItem($itemId, $attachment); 
    $attchments = $this->dbAttachmentRepository->getAllForLead($itemId); 
    $this->assertCount(1, $attchments); 
} 

Эта часть кода также проверяет все зависимости, прошедших через. Я не уверен, что все в порядке.

Также при настройке хранилища мы могли бы иметь дерево зависимостей, как это:

$userRepository = new DBUserRepository($this->dbConnection); 
$attachmentFactory = new AttachmentFactory($userRepository); 
$this->dbAttachmentRepository = new DBAttachmentRepository($this->dbConnection, $attachmentFactory); 

Является ли это правильный подход для выполнения интеграционного тестирования для хранилищ?

Обновление: Чтобы быть более конкретным, я уже использую DBUnit и базу данных sqlite в памяти, которая заполняется каждый раз при запуске тестового файла. Тем не менее, мой вопрос касается того, нормально ли создавать все зависимости, необходимые для какой-либо операции, связанной с репозиторием.

Благодаря

ответ

0

На самом деле, насколько я понимаю, в тесте интеграции, вы хотели бы проверить ваше хранилище с реальными границами.

поэтому вместо того, чтобы создавать объекты и помещать их в репозиторий, я бы сразу вставлял данные в вашу базу данных, проверял, можете ли вы получить данные и удалить их из базы данных.

вы можете сделать это вручную или с помощью DBUnit

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

с DBUnit вы можете создавать файлы XML/CSV/YAML, где вы определяете данные, и DBUnit автоматически вставляют и очищают вас.

https://phpunit.de/manual/current/en/database.html

+0

Я использую в SQLite памяти тестовой базы данных и DbUnit и я заполнение базы данных с фиктивными данными. Однако вместо чтения данных я хочу проверить вставку данных. См. Мой второй пример выше. Мой вопрос заключается в том, как обращаться с репозиториями, у которых есть дерево зависимостей. – rungurean

+0

Я просто отразил мое ручное тестирование на PHPUnit. Допустим, вы не использовали бы тесты, как бы вы проверили свою вставку? Вы должны проверить базу данных и посмотреть, есть ли ожидаемые записи. Итак, после «addAttachmentForItem» я бы просто вызвал простой запрос SQL к конкретным таблицам и проверил значения. Возможно, создайте перед ожидаемым stdClass для более легкой компенсации. –

+0

Именно это я и делал. $ attchments = $ this-> dbAttachmentRepository-> getAllForLead ($ itemId); выполняет запрос в базу данных тестирования в памяти. Опять же, мой вопрос касается объекта привязки и объекта пользователя! Почему задача класса DBAttachmentRepositoryTest проверять/создавать экземпляры? – rungurean

Смежные вопросы