6440


現在Fuelphpを使用したアプリケーション内で、DBクラスとModelクラスで別々でトランザクションを貼ってテストを書いている部分があります。

・Modelクラス

[code]

    <?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();
        }
    }
    
[/code]

・テストクラス

[code]

    <?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));
        }
    }
    
[/code]

この状態でテストを実行すると、ロールバック時にモデル経由で作成されたレコードが、DB上から削除されません。

原因としてはModel内の$_connectionで別途コネクションを貼っているからだと思っています。

こういった場合にテスト中に発生している全トランザクションを取り消すにはどうすればいいのでしょうか？

DB::rollback_transaction(true);も試してみたのですが、Model側で発生したトランザクションまではロールバックされませんでした。

ご存知の方いらっしゃいましたら、教えて頂けると非常に助かります。


CC BY-SA 3.0
2015-02-11T15:49:10.337
6338
2015-02-13T08:08:55.007
5458
question
php fuelphp
[fuelphp]DBクラスとModelクラスのロールバック方法


モデルでのコネクションは`test_connection`ですが、テスト中のトランザクションはコネクションの指定がないため、たぶん`default`になります（正確にはdb.phpでの設定によりますが）。

ということで、トランザクションは`default`でしか開始されていません。

モデルでの処理をロールバックしたい場合は、`test_connection`でもトランザクションを開始してロールバックする必要があります。

`DB::start_transaction()`は引数にコネクションを指定できます。  
<http://fuelphp.jp/docs/1.8/classes/database/db.html#/method_start_transaction>


CC BY-SA 3.0
2015-02-13T08:08:55.007
6440
2015-02-13T08:08:55.007
5489
6338
answer