unit-testing - CakePHP 使用映射方法测试行为

标签 unit-testing cakephp cakephp-2.1

创建 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/

相关文章:

CakePHP 和 Oauth

unit-testing - 如何在 Play 框架中针对非内存数据库(如 MySQL)创建单元测试,并重置为已知状态?

python - 魔术模拟 assert_called_once 与 assert_called_once_with 奇怪的行为

ios - 从 UnitTest 启动 ViewDidAppear

java - 如何使用 Mockito/Powermockito 在内部类中对逻辑进行单元测试

php - CakePHP - Controller::flash() 不重定向

php - 我的 json 网络服务意外地产生了斜杠

cakephp - tcpdf - 背景图像 - CakePdf

cakephp - 是否可以自定义 CakePHP 的级联删除?

cakephp - 在模型中定义全局条件