Как вставить строки базы данных для конкретного теста с помощью PHPUnit - PullRequest
6 голосов
/ 22 февраля 2012

При использовании PHPUnit для тестирования класса, который опирается на базу данных, метод getDataSet () предоставляет данные, которые служат в качестве фиксатора теста для всего набора тестов. Это здорово, но как предоставить данные для конкретного теста? Нет ничего необычного, особенно при использовании минимизированных наборов данных, для каждого теста требуются разные данные базы данных поверх общих данных, которые используются во всех тестах. Я знаю, что объект PDO доступен, и в нашем случае также доступен собственный объект БД приложения (то есть мы можем выполнять необработанные запросы или использовать другие функции в приложении), но было бы неплохо иметь способ для вставки данных это основано на контейнерах DataSet в PHPUnit, поэтому все тестовые данные обрабатываются одинаково для повышения ясности и упрощения обслуживания.

Есть ли способ сделать это?

Ответы [ 2 ]

8 голосов
/ 22 февраля 2012

Вы могли бы следовать такой грязной уловке:

protected function getDataSet()
{
    if (in_array($this->getName(), array('testA', 'testB', '...'))) {
        return $this->createXMLDataSet(__DIR__ . '/_fixtures/fistureA.xml');
    }

    return $this->createXMLDataSet(__DIR__ . '/_fixtures/fixtureB.xml');
}

Небольшое примечание: $this->getName() возвращает имя текущего метода тестирования

Альтернативный подход заключается в повторном запуске операций настройки вначало теста:

public function testA()
{
    $this->getDatabaseTester()->setDataSet($this->createFlatXMLDataSet(__DIR__ . '/_fixtures/fixtureForTestA.xml'));
    $this->getDatabaseTester()->onSetUp();

    /* your test code */
}
5 голосов
/ 11 ноября 2015

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

Вы можете сделать это, вызвав execute метод IDatabaseOperation, который вы можете получить из PHPUnit_Extensions_Database_Operation_Factory.В основном вы бы использовали CLEAN_INSERT или INSERT.

В качестве второго подхода zerkms , вы бы назвали его в начале каждого теста, который требует определенных данных.Например:

public function testA() {
  PHPUnit_Extensions_Database_Operation_Factory::INSERT()
    ->execute($this->getConnection(), $this->createXMLDataSet(__DIR__.'/fixtureA.xml'));

  // Test code
}

Однако преимущество этого решения заключается в том, что набор данных всего контрольного примера остается неизменным, поэтому:

  • Методы испытаний остаются независимыми друг от друга (тогда как в подходе zerkms, если вы не забудете / не забудете указать набор данных в другом методе тестирования, он будет повторно использовать набор данных из предыдущего (случайного?) метода, который изменилнабор данных, который довольно уродлив и очень подвержен ошибкам ИМХО).Здесь любой другой тест без такого вызова в его начале будет просто использовать набор данных тестового набора как обычно.
  • Вы можете построить свой тестовый набор данных поверх общего набора (тестового набора) .Если вы используете операцию INSERT (не CLEAN_INSERT), она вставит строки, специфичные для теста, после всех строк из общего набора данных.Вы также можете использовать операцию DELETE, чтобы удалить некоторые нежелательные строки из этого общего набора данных.
  • Кстати, не вызывая onSetUp(), это делает эту работу, даже если операция настройки тестового примера была изменена.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...