dbunit в phpunit не усекает таблицы - PullRequest
16 голосов
/ 29 февраля 2012

В настоящее время я использую PHPUnit и DBUnit для своего проекта. У меня проблема в DBUnit, потому что класс DBUnit PHPUnit_Extensions_Database_TestCase & Sysy; Src , похоже, не усекает существующие данные в тестовой базе данных. Так что из-за этого мои тесты на вставку не срабатывают, работая только один раз.

Я использую mysql и вот мой код:

abstract class Generic_Tests_DatabaseTestCase extends PHPUnit_Extensions_Database_TestCase
{
    // only instantiate pdo once for test clean-up/fixture load
    static private $pdo = null;

    // only instantiate PHPUnit_Extensions_Database_DB_IDatabaseConnection once per test
    private $conn = null;

    final public function getConnection()
    {
        if ($this->conn === null) {
            if (self::$pdo == null) {
                self::$pdo = new PDO( "mysql:dbname=db;host=localhost", "root", "pass" );
            }
            $this->conn = $this->createDefaultDBConnection(self::$pdo, "db");
        }

        return $this->conn;
    }
}

class DbopTest extends Generic_Tests_DatabaseTestCase
{       
    private $db;

    protected function setup(){
        $this->db = null;
    }

    public function getDataSet(){
        return $this->createMySQLXMLDataSet(dirname(__FILE__) . '/../rows.xml');
    }       
    ...
}

Так как я могу исправить эту проблему? Что я здесь не так делаю?

Ответы [ 4 ]

38 голосов
/ 01 марта 2012

Если вы переопределите метод setUp, PHPUnit не будет автоматически вызывать ваш метод getDataSet. Вы также должны позаботиться о том, чтобы вы вызывали метод parent::setUp, иначе PHPUnit не знает, что делать;).

5 голосов
/ 12 февраля 2014

Я столкнулся с этой проблемой сам, и вот как я решил ее после небольшого поиска исходного кода PHPUnit. Похоже, что поведение по умолчанию для класса PHPUnit_Extensions_Database_TestCase - возвращать PHPUnit_Extensions_Database_Operation_Factory :: NONE (). Для того, что вам нужно, и того, как документ PHPUnit, по-видимому, подразумевает, как он должен работать, вам нужно переопределить метод для возврата PHPUnit_Extensions_Database_Operation_Factory :: TRUNCATE ().

К счастью, это довольно просто. Вам просто нужно добавить следующее в ваш класс TestCase.

protected function getTearDownOperation()
{
    return \PHPUnit_Extensions_Database_Operation_Factory::TRUNCATE();
}

До этого я вручную обрезал таблицы в своем методе Teardown (), но я думаю, вы согласитесь, что это решение намного лучше.

1 голос
/ 17 апреля 2014

Не ожидая слишком много похвалы за этот ответ, но я потратил несколько часов, пытаясь выяснить, почему одна из моих таблиц тестовой базы данных не усекалась, вызывая ту же ошибку повторяющегося ввода, описанную выше.Мой getDataSet () выглядел как

function getDataSet() {

    $files = array('languages','interpreters','interp_languages',
        'interp_events','deft_events',
           //etc
    );

    $dataSets = array();
    foreach ($files as $file) {
        $dataSets[] = new PHPUnit_Extensions_Database_DataSet_MysqlXmlDataSet(
         $this->files_dir."/$file.xml");
    }

    return new PHPUnit_Extensions_Database_DataSet_CompositeDataSet($dataSets);
}

, и техника отлично работала на других тестовых классах.Бывает, что я случайно пропустил одно из моих имен файлов данных xml из $ files, , поэтому DbUnit не загружал этот файл данных, поэтому не усекал таблицу.Но поскольку в таблице осталось много строк из других тестов, в которых использовался тот же файл данных, для меня не было очевидным, что происходит.

Надеюсь, это спасет кого-то еще от разрыва ее /его глаза когда-нибудь выпадут.

0 голосов
/ 29 февраля 2012

У вас должен быть метод getDataSet(), иначе PHPUnit предполагает, что у вас нет данных для исправления.

http://www.phpunit.de/manual/3.6/en/database.html

Метод getDataSet () определяет, как должно выглядеть начальное состояние базы данных перед выполнением каждого теста.Состояние базы данных абстрагируется через понятия DataSet и DataTable, которые представлены интерфейсами PHPUnit_Extensions_Database_DataSet_IDataSet и PHPUnit_Extensions_Database_DataSet_IDataTable.В следующем разделе будет подробно описано, как работают эти концепции и каковы преимущества их использования при тестировании базы данных.

Для реализации нам нужно только знать, что метод getDataSet () вызывается один раз во время setUp ()получить набор данных прибора и вставить его в базу данных.В этом примере мы используем фабричный метод createFlatXMLDataSet ($ filename), который представляет набор данных через представление XML.

...