Модульный тест базы данных привязан к деталям реализации

У меня есть простой PHP-класс, который оборачивает доступ к базе данных, чтобы получить пользователя и хочет выполнить его юнит-тестирование. В настоящее время у меня есть следующий код:

Класс для тестирования:

class UserTable {

protected $tableGateway;

public function __construct(\Zend\Db\TableGateway\TableGateway $tableGateway) {
$this->tableGateway = $tableGateway;
}

public function getUserWithId($id) {
return $this->tableGateway->select(['id' => $id])->current();
}
}

Модульный тест:

class UserTableTest extends \PHPUnit_Framework_TestCase {
public function testGetUserWithIdReturnsCorrectUser() {
$user = new User();

$resultSet = new ResultSet();
$resultSet->initialize([$user]);

$mockTableGateway = $this->getMock('\Zend\Db\TableGateway\TableGateway', ['select'], [], '', false);
$mockTableGateway->expects($this->once())->method('select')->with(['id' => 1])->willReturn($resultSet);

$userTable = new UserTable($mockTableGateway);

$this->assertEquals($user, $userTable->getUserWithId(1));
}
}

Однако теперь модульное тестирование не будет выполнено, если позднее я решу изменить способ использования шлюза таблицы (например, использовать select(['id = ?' => $id]). Это связывает модульный тест с деталями реализации getUserWithId($id) чего следует избегать.

Что было бы наилучшей практикой, чтобы не допустить зависимости модульного теста от деталей реализации? Стоит ли пытаться настроить фактическую базу данных тестирования, с которой может работать модульный тест (что также значительно замедлит выполнение теста), или есть лучший способ для проверки шлюза таблицы?

3

Решение

Не издевайтесь над кодом, который вам не принадлежит! * Для классов, использующих базу данных, вы должны написать интеграционные тесты. Хорошо, что это заставит вас отделить доступ к БД от другой логики.

* Это реальный совет из книги «Растущее объектно-ориентированное программное обеспечение на основе тестов», подкрепленный моим собственным опытом написания тестов для кода, использующего Entity Manager от Doctrine.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]