【问题标题】:PHPUnit stub only works for the first methodPHPUnit 存根仅适用于第一种方法
【发布时间】:2013-01-28 02:40:45
【问题描述】:

我正在尝试对 Amazon 的实例元数据类进行存根,因为它调用的内部 URL 只能在 EC2 实例中使用,并且不能从外部调用。我的问题是无法识别“发送”方法。不过,“get”方法工作得很好。这是错误Fatal error: Call to undefined method Stub\Amazon\StubInstanceMetadata::send() in ...etc, etc

    $stub = $this->getMockBuilder('Aws\Common\InstanceMetadata\InstanceMetadataClient')
                 ->disableOriginalConstructor()
                 ->getMock();

    $stub->expects($this->any())
         ->method('get')
         ->will($this->returnValue($this));

    $stub->expects($this->any())
         ->method('send')
         ->will($this->returnValue(json_encode(array('test' => 'value'))));

编辑:这最终是两个不同问题的组合。第一个是@fab 指出的。第二个是返回对 $this 的引用,PHPUnit 有它自己的方法,所以我应该这样做:

    $stub->expects($this->any())
         ->method('get')
         ->will($this->returnSelf()); // don't use returnValue() here

【问题讨论】:

    标签: php phpunit


    【解决方案1】:

    我不知道原始类,但看起来send 实际上不是它的方法,而是通过魔术__call 调用的。所以如果你想模拟它,你必须明确地这样做:

    ...->getMock(array('get', 'send'));
    

    【讨论】:

    • 你是对的!这不是一个实际的方法,但这个解决方案也不起作用:(我也尝试通过$this->setMethods(array('get', 'send'))手动指定方法无济于事。这变得非常令人沮丧!
    • 对,MockBuilder 应该是 setMethods()。如果这不起作用,我不知道,对不起。
    • 使用 setMethods() 或 ->getMock(array('get', 'send')) 只会返回只包含那些方法的类。如果您不提供 setMethods() 或带有方法的数组,则默认情况下所有公共方法都将被存根。
    • @qrazi 是的。并且需要这两种方法。默认设置的问题在于send 不是(显式)公共方法,而是调用了__call
    • 不,在这种情况下不应该。请再次阅读我的评论...更多信息:stackoverflow.com/questions/6210695/…
    猜你喜欢
    • 2021-05-29
    • 2014-07-21
    • 2021-05-18
    • 1970-01-01
    • 2020-10-04
    • 2013-04-20
    • 2020-05-13
    • 1970-01-01
    • 2013-08-24
    相关资源
    最近更新 更多