さて、まず kunit さんの記事 「CakePHP2 から CakePHP3 ORM を使ってみる」 を読ませていただいて、
「既存のコードは、製品コードの他にテストのコードがあるのだけれど、どうすればいいのかな?」
という疑問がわきました。
さて、どこまでできるかわからないのですが、試してみることにしました。
kunit さんがもともと用意していたリポジトリが使えるのでとても楽に進めることができました。ありがとうございます!
今回、私の方で手を加えたソースの差分は、こちら。
テストを動かすためにつまずいた点や思いついたことを並べてみます。
phpunit は何を使えば良い?
とりあえず、今回は CakePHP 2 と 3 の両方でサポートしている 5.7.* にしました。
ただ、php 7.2 を使うのであれば、phpunit 6 以上が必要らしいのですが、
6 は来年2月1日でサポート終了なので 7.x 系がいい?
ORM へのテストデータベースへの接続方法
CakePHP では、テスト実行時にテストデータベースへ接続します。どうやって接続先を切り替えたらいいのでしょう?
現状では、それぞれ別々の設定を持っていて全く連携していないので、何か手を打つ必要がありそうです。
調べた結果、接続先は Cake\Datasource\ConnectionManager で制御していました。
\Cake\Datasource\ConnectionManager::setConfig(
\Cake\Core\Configure::consume('Datasources')
);
として、 test
もデータソースとして設定した後、
ConnectionManager::alias('test', 'default');
をテスト実行時に設定します。
今回は、 app/Test/bootstrap.php
に上のコードを書くだけにしてます。
これで、 テストデータベースへ接続するようになりました。
この処理は CakePHP 3 の場合は、 FixtureManager 内でやってくれるみたいだけれど、
CakePHP 2 のフィクスチャしかないので、ORM の部分は自前で FixtureManager を実装することになるはず。
TestCase::getMockForModel() の実装
モデルをモックしたい場合もあると思います。
これも、 ORM 部分の実装は、 3 から取ってこないとダメっぽい。
真面目に実装するとなると こちら をコピって動くようにするわけだけど、
面倒臭そうなので、今回はパスかな。
以上、雑に調べてみましたが、意外といけるかも?という感触は得られて満足です。