gpt4 book ai didi

unit-testing - 如何模拟 CakePHP 的单元测试行为

转载 作者:行者123 更新时间:2023-12-04 14:01:20 28 4
gpt4 key购买 nike

我刚刚开始在 CakePHP 中进行单元测试(是的!)并遇到了以下挑战。希望有人可以帮助我:-)

情况

我的模型在本地保存后使用 Behavior 将更改发送到 API。我想伪造测试期间对 API 的所有调用(这些调用将单独测试)以节省 API 服务器上的负载,更重要的是,实际上并不保存更改:-)

我正在使用 CakePHP 2.4.1。

我试过的

  • 阅读文档。 The manual展示了如何为组件和助手执行此操作,但不为行为执行此操作。
  • 谷歌。我发现了什么:
  • A Google Group post这只是“不可能”。我不接受否定的答案。
  • An article解释如何模拟对象。非常接近。

  • 文章中的代码如下:
    $provider = $this->getMock('OurProvider', array('getInfo'));
    $provider->expects($this->any())
    ->method('getInfo')
    ->will($this->returnValue('200'));

    这可能是错误的方向,但我认为这可能是一个好的开始。

    我要什么

    有效:一段代码,用于演示如何模拟 CakePHP 模型中的行为以进行单元测试。

    也许这个问题也会导致添加 CakePHP 手册作为额外的奖励,因为我觉得那里缺少它。

    预先感谢您的努力!

    更新 (2013-11-07)

    我找到了 this related question ,这应该回答这个问题(部分)。无需模拟 API,相反,我可以创建模型将使用的行为测试。

    我试图弄清楚 BehaviorTest 应该是什么样子。

    最佳答案

    使用类注册表
    与许多类一样,行为是 added to the class registry使用类名作为键,并用于对同一对象的后续请求 loaded from the classregistry .因此,模拟行为的方法就是在使用它之前将其放入类注册表中。
    完整示例:

    <?php
    App::uses('AppModel', 'Model');

    class Example extends AppModel {

    }
    class TestBehavior extends ModelBehavior {

    public function foo() {
    throw new \Exception('Real method called');
    }
    }

    class BehaviorExampleTest extends CakeTestCase {

    /**
    * testNormalBehavior
    *
    * @expectedException Exception
    * @expectedExceptionMessage Real method called
    * @return void
    */
    public function testNormalBehavior() {
    $model = ClassRegistry::init('Example');
    $model->Behaviors->attach('Test');

    $this->assertInstanceOf('TestBehavior', $model->Behaviors->Test);
    $this->assertSame('TestBehavior', get_class($model->Behaviors->Test));
    $this->assertSame(['foo' => ['Test', 'foo']], $model->Behaviors->methods());

    $model->foo();
    }

    public function testMockedBehavior() {
    $mockedBehavior = $this->getMock('TestBehavior', ['foo', 'bar']);
    ClassRegistry::addObject('TestBehavior', $mockedBehavior);

    $model = ClassRegistry::init('Example');
    $model->Behaviors->attach('Test');

    $this->assertInstanceOf('TestBehavior', $model->Behaviors->Test);
    $this->assertNotSame('TestBehavior', get_class($model->Behaviors->Test));

    $expected = [
    'foo' => ['Test', 'foo'],
    'bar' => ['Test', 'bar'],
    'expects' => ['Test', 'expects'], // noise, due to being a mock
    'staticExpects' => ['Test', 'staticExpects'], // noise, due to being a mock
    ];
    $this->assertSame($expected, $model->Behaviors->methods());

    $model->foo(); // no exception thrown

    $mockedBehavior
    ->expects($this->once())
    ->method('bar')
    ->will($this->returnValue('something special'));

    $return = $model->bar();
    $this->assertSame('something special', $return);
    }
    }

    关于unit-testing - 如何模拟 CakePHP 的单元测试行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19833495/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com