現在Fuelphpを使用したアプリケーション内で、DBクラスとModelクラスで別々でトランザクションを貼ってテストを書いている部分があります。
・Modelクラス
<?php
class Model_Hoge extends Orm\Model {
protected static $_table_name = 'hoge';
protected static $_properties = array(
'id',
'name',
);
protected static $_connection = 'test_connection';
public static function get_results()
{
// データベースに対する処理
return 0;
}
public static function new_record()
{
Model_Hoge::forge(array(
'id' => '5',
'name' => 'ajapa-',
))->save();
}
}
・テストクラス
<?php
use Fuel\Core\DB;
use Fuel\Core\TestCase;
use Fuel\Core\Format;
class Test_Model_Hoge extends TestCase
{
public function setUp()
{
DB::start_transaction();
}
public function tearDown()
{
DB::rollback_transaction();
}
public static function initializeData($yaml_filepath)
{
$data = file_get_contents($yaml_filepath);
$tables = Format::forge($data, 'yaml')->to_array();
foreach (array_keys($tables) as $table_name) {
$rows = $tables[$table_name];
foreach ($rows as $row) {
try
{
DB::insert($table_name)->set($row)->execute();
}
catch(Exception $e)
{
DB::rollback_transaction();
throw $e;
}
}
}
}
public function test_hoge()
{
$this->initializeData(APPPATH . 'tmp/testdata.yml');
Model_Hoge::new_record();
$hoge = Model_Hoge::find('all');
$this->assertEquals(1, count($hoge));
}
}
この状態でテストを実行すると、ロールバック時にモデル経由で作成されたレコードが、DB上から削除されません。
原因としてはModel内の$_connectionで別途コネクションを貼っているからだと思っています。
こういった場合にテスト中に発生している全トランザクションを取り消すにはどうすればいいのでしょうか?
DB::rollback_transaction(true);も試してみたのですが、Model側で発生したトランザクションまではロールバックされませんでした。
ご存知の方いらっしゃいましたら、教えて頂けると非常に助かります。