Zend Framework アプリケーション内で PHP Unit を使用したいと考えています。テスト内でいくつかのデータベース書き込み操作を行う必要があります。setUpBeforeClass() メソッドで MySQL トランザクションを開始したいと考えています。それは可能ですが、tearDownAfterClass() メソッドでトランザクションをロールバックしようとすると、「アクティブなトランザクションがありません」というメッセージで例外がスローされます。また、テスト メソッドはデータベースへの書き込み操作を行います。しかし、テストメソッド自体でトランザクションを開始すると。それは私が望むように動作します。なぜこのように反応するのか理解できません。誰か説明を知っていますか?
<?php
class ConferenceControllerTest
extends PHPUnit_Framework_TestCase
{
/**
* A database connection.
* @var Zend_Db_Adapter_Pdo_Mysql
*/
protected static $hostDb = null;
public static function setUpBeforeClass()
{
static::$hostDb = Zend_Registry::get('db_host');
static::$hostDb->beginTransaction();
// The transaction for the Adapter is activated. But not inside the tests anymore.
}
public function testTest1()
{
// At this position teh transaction is not setted anymor? Why?
static::$hostDb->beginTransaction();
$sql = 'INSERT INTO test(test) VALUES(5);';
static::$hostDb->exec($sql);
}
public static function tearDownAfterClass()
{
try
{
static::$hostDb->rollBack();
}
catch(Exception $exception)
{
$message = $exception->getMessage();
Zend_Debug::dump($message);
}
}
}