创建 OwnableBehavior
时我决定使用$mapMethods
可用的属性(property)。它是映射任何名为 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);
这是有效的,因此看起来由于某种原因映射的方法在单元测试期间不起作用。我已经在 Controller 中测试了映射的方法,没有收到任何错误。
我想知道这是否取决于我如何将行为加载到模型中。我在食谱中找不到任何有关如何正确测试行为(如组件、助手等)的文档...因此我只是使用了核心行为测试所使用的相同技术(可在 Cake/Test/Case/Model/Behavior/
中找到)。
我确实认为这可能是因为我覆盖了 ModelBehavior::setup()
方法,但我尝试添加 parent::setup($model, $settings)
在设置方法开始时,我仍然遇到相同的错误。我不会覆盖任何其他 ModelBehavior
方法。
我想我可以使用OwnableBehavior::isOwnedBy()
方法,但我很想知道是否可以让映射的方法在单元测试期间工作。
最佳答案
我找到的解决方案是替换这一行:
$result = $TestModel->Behaviors->Ownable->isOwnedByUser(...);
与:
$result = $TestModel->isOwnedByUser(...);
因此,这只是更像在应用程序中使用它的情况,直接从模型调用行为方法。我不知道这是否会破坏单元测试的想法并使其更多地融入集成测试。
关于unit-testing - CakePHP 使用映射方法测试行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13518340/