2

作成中に、使用可能なプロパティOwnableBehaviorを使用することにしました。呼び出された$mapMethodsメソッドをマップすることです(これに関するドキュメントのリンクはここにあります)isOwnedByXXX()isOwnedBy()

これが私のOwnableBehaviorコードです:

class OwnableBehavior extends Model Behavior {

    public $mapMethods = array('/isOwnedBy(\w+)/' => 'isOwnedBy');

    public function isOwnedBy(Model $model, $type, $id, Model $userModel, $userId) {
         // Method is currently empty
    }
}

TestCaseコードは次のとおりです。

class OwnableBehaviorTest extends CakeTestCase {

    public function testIsOwned() {
        $TestModel = new Avatar();
        $TestModel->Behaviors->attach('Ownable');
        $result = $TestModel->Behaviors->Ownable->isOwnedByUser(
            $TestModel, 1, new User(), 1);
        $this->assertTrue($result);
    }
}

テストを実行すると、次のエラーが発生します。

 Call to undefined method OwnableBehavior::isOwnedByUser()

メソッド呼び出しをisOwnedBy($TestModel, 'user', 1, new User(), 1);これに変更すると、動作するので、何らかの理由で、単体テスト中にマップされたメソッドが動作していないように見えます。コントローラーでマップされたメソッドをテストしましたが、エラーは発生しません。

動作をモデルにロードする方法にかかっているのではないかと思いました。コンポーネントやヘルパーなどの動作を適切にテストする方法についてのドキュメントがクックブックに見つかりませんでした。そのため、コア動作テストで使用するのと同じ手法を使用しました(にありますCake/Test/Case/Model/Behavior/)。

メソッドを上書きしていることが原因かもしれないと思いましたが、セットアップメソッドの最初にModelBehavior::setup()追加しようとしましたが、それでも同じエラーが発生します。parent::setup($model, $settings)私は他のModelBehavior方法を上書きしていません。

このメソッドを使用することもできるOwnableBehavior::isOwnedBy()と思いますが、単体テスト中にマップされたメソッドを機能させることができるかどうかを知りたいと思います。

4

1 に答える 1

2

私が見つけた解決策は、この行を置き換えることです。

$result = $TestModel->Behaviors->Ownable->isOwnedByUser(...);

と:

$result = $TestModel->isOwnedByUser(...);

つまり、モデルから直接ビヘイビアーメソッドを呼び出して、アプリケーションで使用するのと同じように使用する場合にすぎません。これが単体テストのアイデアを台無しにし、統合テストにさらに発展させるかどうかはわかりませんが。

于 2012-11-23T09:47:19.890 に答える