Спасибо за подробный ответ.
По поводу автоматической генерации и сравнения схем — об этом я тоже подумал, и думаю смысл всё же в этом есть. Ещё можно фикстуры генерить автоматически, основываясь на данных рабочей базы, потому что протестировать нужно очень много случаев, и необходимо чтобы различные связи между данными таблиц были соблюдены. Например есть пользователи и их посты. Нужно обязательно чтобы в фикстурах были юзеры, у которых есть один пост, несколько, ни одного. Конечно, при первичном формировании таких данных будет использоваться текущий, то бишь не протестированный код, но в принципе должно получиться.
Но всё равно главное осталось мне неясным :(( Задача стоит протестировать не код, а
работу сервиса, и то, что сервис обращается к БД, как раз дело и усложняет («предпологаем что бд работает корректно» — она-то так и работает, mysql отлаживают другие люди, а вот какие туда вызовы поступают — уже моя ответственность). Какие есть способы протестировать работу с базой без задействования базы? Какие именно данные нужно mock'нуть и где что проверять?
вот есть например такой класс
<?php
// file app/User.php
class User {
...
public function create($params) {
$this->pdo->prepare("INSERT INTO `users` ...");
$this->pdo->execute($params);
}
}
И тест
<?php
// file tests/TestUser.php
function testUserIsCreatedSuccessfully() {
...
$user->create(array('firstname'= > 'John', 'lastname' => 'Doe'));
...
$this->assertTablesEqual($expectedTable, $queryTable);
}
Как именно и что нужно мокапить в функции, тестирующей добавление пользователя? Значит ли это, что нужно править тестируемый метод, чтобы он не в бд ещё писал, а делал нечто другое? Ведь, так или иначе, в коде теста вызывается тестируемый метод, пишущий в базу. Как узнать, что он корректно отработал, не обращаясь к БД?