バグか?

テストってやつをみてみた。
http://book.cakephp.org/ja/view/160/%E3%83%86%E3%82%B9%E3%83%88-Testing

Fixtureの設定ポイントは3つ。

  • var $name
  • var $import
  • var $fields
  • var $records

$name は Fixture の名前を規定するので特に問題ないか?
とりあえずアンスコ使った場合はキャメルケースになるので注意なだけかな。


$import。
キーとしては

  • model | table
  • records
  • connection

辺りか?
modelの場合はアプリケーションのモデルを使用する場合。
tableの場合は、testデータベースのモデルを使用する場合。


records は true/false でレコードを使用するかどうか。
trueにした場合 $records でテスト用データを指定しても使われないので注意が必要。
逆に言うと $records を使用するときは false にする。


connection はどのデータベースを使用するか。
model 使用時はデフォルトでは "test" を見る?
table 使用時はデフォルトでは "default" を見る?


$fields。
test データベースのテーブルを使用する場合、テーブルの構造を規定する。
たぶんモデルクラスが存在しない場合にここに記述して使用する感じ。

2008/10/22 追記 /////////////////////////////
$import と $fields はテスト用テーブルのテーブル定義をどこから取得するか?のようだ。
存在するテーブル(アプリ用orテスト用)から取得する場合は $import を
存在しないので自分で指定する場合は $fields を使用するイメージ。
/////////////////////////////////////////////////////////////////////////////////


$records。
テストデータを規定する。
テスト前に挿入され、テスト後に削除される。データはすべてフィールドを埋める必要がある?

var $import = array('model'=>'User', 'records'=>true)

な感じのとき、User モデルを使用して default データベースからデータを取ってきて
test データベースに入れてくれるらしいのにならんかった。
よくみたらバグ?っぽい。

CakeTestFixture::init()

if (isset($import['records']) && $import['records'] !== false && isset($model) && isset($db)) {
	$this->records = array();

	$query = array(
		'fields' => array_keys($this->fields),
		'table' => $db->fullTableName($model->table),
		'alias' => $model->alias,
		'conditions' => array(),
		'order' => null,
		'limit' => null,
		'group' => null
	);

        // ↓たぶんここが問題。取ってきたときにモデル名のキーにならない
	foreach ($query['fields'] as $index => $field) {
		$query['fields'][$index] = $db->name($query['alias']) . '.' . $db->name($field);
	}
	// ↑
	// こんな感じにしないとだめな気がする
	// $query['fields'] = $db->fields($model, null, $query['fields']);

	$records = $db->fetchAll($db->buildStatement($query, $model), false, $model->alias);

	$query['fields'] = $db->fields($model, null, $query['fields']);

	if ($records !== false && !empty($records)) {
		$this->records = Set::extract($records, '{n}.' . $model->alias);
	}