3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CakePHP 2 から CakePHP3 ORM を使ったテスト

Last updated at Posted at 2018-12-12

さて、まず 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 から取ってこないとダメっぽい。

真面目に実装するとなると こちら をコピって動くようにするわけだけど、
面倒臭そうなので、今回はパスかな。

以上、雑に調べてみましたが、意外といけるかも?という感触は得られて満足です。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?