使用映射方法的CakePHP测试行为

时间:2012-11-22 18:30:17

标签: unit-testing cakephp cakephp-2.1

创建OwnableBehavior时,我决定使用可用的$mapMethods属性。它是将任何名为isOwnedByXXX()的方法映射到isOwnedBy()(关于此文档的链接是here

这是我的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);,则可以使用,因此在某些情况下,映射方法在单元测试期间不起作用。我已在控制器中测试了映射方法,但没有错误。

我想知道是否将我的行为加载到模型中。我在cookbook中找不到任何关于如何正确测试行为的文档,就像有组件,助手等一样...所以我只使用了核心行为测试使用的相同技术(在Cake/Test/Case/Model/Behavior/中找到)

我确实认为可能是因为我覆盖了ModelBehavior::setup()方法,但我尝试在setup方法的开头添加parent::setup($model, $settings)并且仍然遇到相同的错误。我没有覆盖任何其他ModelBehavior方法。

我想我可以使用OwnableBehavior::isOwnedBy()方法,但我非常想知道在单元测试期间是否可以使映射方法起作用。

1 个答案:

答案 0 :(得分:2)

我找到的解决方案正在替换这一行:

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

使用:

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

所以这只是一个使用它的情况,就像你在应用程序中一样,直接从模型调用行为方法。我不知道这是否会破坏单元测试的想法,并使其更多地进入集成测试。