【问题标题】:CakePHP test behaviour with mapped methodCakePHP 使用映射方法测试行为
【发布时间】:2012-11-22 18:30:17
【问题描述】:

在创建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
    }
}

这是测试用例代码:

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() 方法,但我很想知道我是否可以让映射的方法在单元测试期间工作。

【问题讨论】:

    标签: unit-testing cakephp cakephp-2.1


    【解决方案1】:

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

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

    与:

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

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

    【讨论】:

    • mapped method logic 由行为 collection 类实现,这就是为什么它不能直接在行为上调用 ->undefinedmethod。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2012-09-18
    • 2016-05-15
    • 2017-04-07
    相关资源
    最近更新 更多