LoginSignup
0
0

More than 5 years have passed since last update.

CakePHP2のコントローラテストで$this->generate()するとClassRegistryが初期化される

Posted at

気がつかなくてしばらくハマったのでメモ(^^;

コントローラのテストでモデルをモックに差し替えてテストしたくなったので、すでにあったテストコードにモック生成コードを追加してはまりました。

        // Mock生成
        $this->UploadFile = $this->getMockForModel('Files.UploadFile', ['getRealFilePath']);

        // ここでMockにあれこれする

        // 元々あったコンポーネント差し替えのコード
        $this->generate(
            'Cabinets.CabinetFiles',
            [
                'components' => [
                    'Download'
                ]
            ]
        );

        // このあとコントローラテスト実行

こんな感じで書いてたらコントローラでモデルがさっぱり差し替わらない。
Xdebug使って処理追っかけてたら getMcokForModel()でモック生成時にClassRegistry::$_objectsにちゃんとモックがはいってるのに、コントローラの実行時にはClassRegistry::$_objectsは初期化されたようにまっさら…

でテストコード中にもClassRegistry::init('Files.UploadFile')でモデルを取得してクラス名確認してて分かったんですが、どうやら$this->generate()するとClassRegistry::$_objectsはきれいさっぱりリセットされるみたいですね。

考えてみると$this->generate()でもモックへの差し替えとかやってるんで、testAction前に一旦まっさらにしてからモック生成と差し替えって流れなんでしょうね…

まとめ

コントローラテストでモデルをモックに差し替えたいときは $this->generate() してから$this->getMockForModel()して差し替えましょう。

0
0
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
0
0