Я пытаюсь написать интеграционные тесты для своих репозиториев. Для простых репозиториев это кажется легким. Я сделал что-то подобное
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 памяти, которая заполняется при каждом запуске тестового файла. Однако мой вопрос касается того, можно ли создавать все зависимости, необходимые для какой-либо операции, связанной с репозиторием.
Спасибо
На самом деле, насколько я понимаю, в интеграционном тесте вы хотели бы проверить свой репозиторий с реальными границами.
поэтому вместо создания объектов и помещения их в репозиторий я бы напрямую вставлял данные в вашу базу данных, проверял, можете ли вы получить данные и удалить их из базы данных.
Вы можете сделать это вручную или с помощью DBUnit
перед каждым тестом вы делаете прямые вставки, сохраняйте вставленные идентификаторы, затем используйте репозиторий для извлечения данных и используйте сохраненные идентификаторы для очистки базы данных впоследствии.
с DBUnit вы можете создавать файлы XML / CSV / YAML, в которых вы определяете данные, а DBUnit автоматически выполняет вставки и очистки.
Других решений пока нет …