現在、PHPUnitフレームワークでデータベースをテストする方法を学習しており、テストで実際のデータベースに接続したくないという問題がありました。これは、別のコンピュータでテストを実行すると、このコンピュータに同じデータベースがない可能性があるためです。PHPUnitのメモリ内SQLITEデータベースのデータを模倣する
私は\PHPUnit\DbUnit\TestCaseTrait
形質を実施し、次の方法の設定:
/**
* Returns the test database connection.
*
* @return \PHPUnit\DbUnit\Database\Connection
*/
protected function getConnection()
{
$pdo = new PDO('sqlite::memory:');
return $this->createDefaultDBConnection($pdo, ':memory:');
}
/**
* Returns the test dataset.
*
* @return \PHPUnit\DbUnit\DataSet\IDataSet
*/
protected function getDataSet()
{
return $this->createXMLDataSet(dirname(__FILE__) . '/test-dataset.xml');
}
データセットファイルが存在し、適切に発見されました。
私のテストのsetUp
メソッドでは、オブジェクトの変数を\PDO
インスタンスに設定しました。
/**
* @var PDO $databaseServerConnection
*/
private $databaseServerConnection;
public function setUp()
{
$this->databaseServerConnection = $this->getConnection()->getConnection();
}
私は今方法でデータセットファイルから来たデータとそのPDO接続を使用することができ期待。私自身の試みのために
、私は次のコードでそれらを比較してみました:これをデバッグする場合
# Specify the tables we want to have in our connection dataset
$tables = ['users'];
# Create the dataset in the connection with the tables
$dataset = $this->getConnection()->createDataSet($tables);
# Query all results from the user table in the connection
$queryTable = $this->getConnection()->createQueryTable(
'users', 'SELECT * FROM users'
);
# Get the raw table data from the dataset file
$expectedTable = $this->getDataSet()->getTable('users');
# Check if theyre equal
$this->assertTablesEqual($queryTable, $expectedTable);
、私は$dataset
内部$tables
配列変数がちょうど空であることに気づきました。ここでは、変数$dataset
のvar_dump
です。
class PHPUnit\DbUnit\Database\FilteredDataSet#18 (3) {
protected $tableNames =>
array(1) {
[0] =>
string(5) "users"
}
protected $tables =>
array(0) {
}
protected $databaseConnection =>
class PHPUnit\DbUnit\Database\DefaultConnection#16 (2) {
protected $connection =>
class PDO#15 (0) {
}
protected $metaData =>
class PHPUnit\DbUnit\Database\Metadata\Sqlite#17 (6) {
protected $columns =>
array(0) {
...
}
protected $keys =>
array(0) {
...
}
protected $truncateCommand =>
string(11) "DELETE FROM"
protected $pdo =>
class PDO#15 (0) {
...
}
protected $schema =>
string(8) ":memory:"
protected $schemaObjectQuoteChar =>
string(1) """
}
}
}
また$queryTable
変数内部$data
配列null
あります。ここに彼$queryTable
のvar_dump
変数。
class PHPUnit\DbUnit\DataSet\QueryTable#22 (6) {
protected $query =>
string(19) "SELECT * FROM users"
protected $databaseConnection =>
class PHPUnit\DbUnit\Database\DefaultConnection#20 (2) {
protected $connection =>
class PDO#19 (0) {
}
protected $metaData =>
class PHPUnit\DbUnit\Database\Metadata\Sqlite#21 (6) {
protected $columns =>
array(0) {
...
}
protected $keys =>
array(0) {
...
}
protected $truncateCommand =>
string(11) "DELETE FROM"
protected $pdo =>
class PDO#19 (0) {
...
}
protected $schema =>
string(8) ":memory:"
protected $schemaObjectQuoteChar =>
string(1) """
}
}
protected $tableName =>
string(5) "users"
protected $tableMetaData =>
NULL
protected $data =>
NULL
private $other =>
NULL
}
この$expectedTable
変数内部$data
配列は、データセットファイルで作成したデータの完全である一方で。
class PHPUnit\DbUnit\DataSet\DefaultTable#30 (3) {
protected $tableMetaData =>
class PHPUnit\DbUnit\DataSet\DefaultTableMetadata#34 (3) {
protected $columns =>
array(3) {
[0] =>
string(2) "id"
[1] =>
string(4) "name"
[2] =>
string(5) "email"
}
protected $primaryKeys =>
array(0) {
}
protected $tableName =>
string(5) "users"
}
protected $data =>
array(4) {
[0] =>
array(3) {
'id' =>
string(1) "1"
'name' =>
string(3) "test1"
'email' =>
string(9) "[email protected]"
}
[1] =>
array(3) {
'id' =>
string(1) "2"
'name' =>
string(3) "test2"
'email' =>
string(9) "[email protected]"
}
[2] =>
array(3) {
'id' =>
string(1) "3"
'name' =>
string(6) "test3"
'email' =>
string(12) "[email protected]"
}
[3] =>
array(3) {
'id' =>
string(1) "4"
'name' =>
string(4) "test4"
'email' =>
string(10) "[email protected]"
}
}
private $other =>
NULL
}
私もその中の値を使用してテーブルを作成するために、getConnection()
メソッド内のPDO接続オブジェクト上で2つのクエリを実行しようとしました:
protected function getConnection()
{
$pdo = new PDO('sqlite::memory:');
$pdo->exec("CREATE TABLE users (id PRIMARY KEY, name VARCHAR(50), email VARCHAR(50))");
$pdo->exec("INSERT INTO users (id, name, email) VALUES (20, 'Bas', '[email protected]')");
return $this->createDefaultDBConnection($pdo, ':memory:');
}
それはいずれかが私の存在しないことを来るどのように私の接続で利用可能なデータのデータセットファイルからデータをここにインポートしてテストをパスするにはどうしたらいいですか?
また、これを行うのは良い方法ですか?
残念ながら動作しませんでしたこと...私はエラー 'COMPOSITE [TRUNCATE]操作がクエリに失敗しました: 引数を使用して "ユーザー" 。DELETE FROM:配列 ( ) [SQLSTATE [HY000]:一般的なエラー: 1 no such table:users] ' – Bas
ありがとうございました!これらのテーブルをインポートするのにベストプラクティスは何でしょうか? 'getConnection'メソッドの中で抽象データベースのテストケースから拡張された' setUp'メソッドの中に? – Bas
私はヘルプを訴えますが、メモリ内のデータベースではないときにそのようなデータベースをセットアップすることはできませんか?私は混乱しています。 – Bas