не удается настроить фикстур (PHPunit с dbunit) - PullRequest
0 голосов
/ 11 октября 2018

Попытка настроить приборы для моих тестов Phalcon, но не получается.Вы можете понять, что пошло не так с моей реализацией?

Использование

  • phalcon 7.2
  • Версия Docker 18.09.0-ce-beta1
  • docker-compose version 1.22.0
  • phpunit6.5.8
  • dbunit 3.0.3

Текущее состояние

  • Подключениев базу данных с помощью функции "getConnection" успешно

  • create dataSet (тип YAML)

  • create getDataSet, но не удается установитьУстройство и очистка

unitTestCase.php

<?php

use Phalcon\Di;
use Phalcon\Mvc\Model\Manager as ModelsManager;
use Phalcon\Test\UnitTestCase as PhalconTestCase;
use PHPUnit\DbUnit\TestCaseTrait;

require_once "CustomHelper.php";

// config of phpunit

abstract class UnitTestCase extends PhalconTestCase
{
use TestCaseTrait;

/**
 * @var bool
 */
private $_loaded = false;

public function setUp()
{
    parent::setUp();

    $di = Di::getDefault();

    $di->set(
        "modelsManager",
        function () {
            return new ModelsManager();
        }
    );
    $di["modelsMetadata"] = function () {
        $metadata = new \Phalcon\Mvc\Model\Metadata\Files(
            [
                "metaDataDir" => joinPaths(__DIR__, "/path/to/metadata/"),
            ]
        );

        return $metadata;
    };
    $di->setShared('mockControllerHelper', new mockControllerHelper());
    $di->setShared('helper', new Helpers());
    $di->setShared('config', function () {
        return require CONFIG_DIR . 'app.php';
    });

    $di->setShared('db', function () {
        $config = $this->getConfig();

        // database configuration from app.php
        $class = 'Phalcon\Db\Adapter\Pdo\\' . $config->database->adapter;
        $params = [
            'host' => $config->database->host,
            'username' => $config->database->username,
            'password' => $config->database->password,
            'dbname' => $config->database->dbname,
        ];

        if ($config->database->adapter == 'Postgresql') {
            unset($params['charset']);
        }

        $connection = new $class($params);

        return $connection;
    });
    $this->setDi($di);

    $this->_loaded = true;
}

public function tearDown()
{
    /* This static call cleans up the Mockery container used by the current test, and run any verification tasks needed for our expectations. */
    \Mockery::close();
}

/**
 * Check if the test case is setup properly
 *
 * @throws \PHPUnit_Framework_IncompleteTestError;
 */
public function __destruct()
{
    if (!$this->_loaded) {
        throw new \PHPUnit_Framework_IncompleteTestError(
            "Please run parent::setUp()."
        );
    }
}



 // Setting part of dbunit
static private $pdo = null;

private $conn = null;

final public function getConnection()
{
    require CONFIG_DIR . 'app.php';
    if ($this->conn === null) {
        if (self::$pdo == null) {
            self::$pdo = new PDO(
                'mysql:host='. $globalConfig->database->host .';dbname=test',
                $globalConfig->database->username,
                $globalConfig->database->password
            );
        }
        $this->conn = $this->createDefaultDBConnection(self::$pdo, 'dbname=test');
    }

     return $this->conn;
}

}

TestControllerTest.php

<?php

namespace Test\Controllers;

use PHPUnit\DbUnit\DataSet\YamlDataSet;

class DatabaseTest extends \UnitTestCase
{
    protected function getDataSet()
    {
        return new YamlDataSet(__DIR__ . "/../DataSet/dataSet.yml");
    }

    public function testsTableRow() {
        $this->assertEquals(1, $this->getConnection()->getRowCount('testRow'), "");
    }
}

DataSet

testRow:
  -
    id: 1
    name: 'test'
    text: 'hello, world'

Ответ

Failed asserting that 0 matches expected 1.

Примечание

Когда я использую настоящее соединение с базой данных mysql в getConnection и вызываю $this->getConnection()->getRowCount('testRow'), результат верный.Таким образом, проблема возникает из-за загрузки набора данных yaml

добавок 1

Содержимое $this->getConnection:

(выполнить print_r($this->getConnection(), false);)

(                                                                                                                                             
    [connection:protected] => PDO Object                                                                                                      
        (                                                                                                                                     
        )                                                                                                                                     

    [metaData:protected] => PHPUnit\DbUnit\Database\Metadata\MySQL Object                                                                     
        (                                                                                                                                     
            [schemaObjectQuoteChar:protected] => `                                                                                            
            [pdo:protected] => PDO Object                                                                                                     
                (                                                                                                                             
                )                                                                                                                             

            [schema:protected] => dbname=test                                                                                         
            [truncateCommand:protected] => TRUNCATE                                                                                           
        )
)

Содержимое $this->getDataSet():

(выполнить print_r($this->getDataSet(), false);)

(                                                                                                                                             
    [tables:protected] => Array                                                                                                               
        (                                                                                                                                     
            [testRow] => PHPUnit\DbUnit\DataSet\DefaultTable Object                                                                           
                (                                                                                                                             
                    [tableMetaData:protected] => PHPUnit\DbUnit\DataSet\DefaultTableMetadata Object                                           
                        (                                                                                                                     
                            [columns:protected] => Array                                                                                      
                                (                                                                                                             
                                    [0] => id                                                                                                 
                                    [1] => name                                                                                               
                                    [2] => text                                                                                               
                                )                                                                                                             

                            [primaryKeys:protected] => Array                                                                                  
                                (                                                                                                             
                                )                                                                                                             

                            [tableName:protected] => testRow                                                                                  
                        )                                                                                                                     

                    [data:protected] => Array                                                                                                 
                        (                                                                                                                     
                            [0] => Array                                                                                                      
                                (                                                                                                             
                                    [id] => 1                                                                                                 
                                    [name] => test
                                    [text] => hello, world
                                )

                        )

                    [other:PHPUnit\DbUnit\DataSet\AbstractTable:private] =>
                )

        )

    [parser:protected] => PHPUnit\DbUnit\DataSet\SymfonyYamlParser Object
        (
        )

)

1 Ответ

0 голосов
/ 11 октября 2018

Dbunit должен выполнить некоторые операции настройки, и они определены в PHPUnit\DbUnit\TestCaseTrait в setUp() методе (вы можете увидеть больше подробностей кода здесь . Когда вы наследуете PHPUnit\DbUnit\TestCase, вам, как правило, не нужнобеспокоиться об этом (кроме того, чтобы просто вызывать parent::setUp() из своего тестового примера.) При использовании функциональности непосредственно из черты, вы должны быть уверены, что установка dbunit также вызывается. Вы можете достичь этого с помощью чего-то, как показано ниже:

<?php
use Phalcon\Test\UnitTestCase as PhalconTestCase;
use PHPUnit\DbUnit\TestCaseTrait;

abstract class UnitTestCase extends PhalconTestCase
{
    use TestCaseTrait {
        setUp as protected dbunitSetUp;
    };

    public function setUp()
    {
        parent::setUp(); // phalcon setup
        $this->dbuintSetUp(); // dbunit setup
    }
}

Для приведенного выше примера включены только строки, имеющие отношение к проблеме, пропуская другие вещи, такие как getConnection и т. Д.

...