gpt4 book ai didi

带有 at() 功能的 PHPUNIT 模拟工作很奇怪

转载 作者:行者123 更新时间:2023-12-04 05:00:29 24 4
gpt4 key购买 nike

这是以下代码示例

<?php

interface iFS
{
public function read();
public function write($data);
}

class MyClass
{
protected $_fs = null;

public function __construct(iFS $fs)
{
$this->_fs = $fs;
}

public function run(array $list)
{
foreach ($list as $elm)
{
$this->_fs->write($elm);
}

return $this->_fs->read();
}
}

class MyTests extends PHPUnit_Framework_TestCase
{
public function testFS()
{
$mock = $this->getMock('iFS');
$mock->expects($this->at(0))
->method('read')
->will($this->returnValue('tototatatiti'));

$c = new MyClass($mock);
$result = $c->run(array('toto', 'tata', 'titi'));

$this->assertEquals('tototatatiti', $result);
}
}

这绝对不是一个真实的案例,但它使 phpunit 和 at($index) 功能发生了一些奇怪的事情。

我的问题很简单,测试失败是否正常?

我明确要求返回“tototatatiti”,但它从未发生过......

什么时候
  • 我删除了行 $this->_fs->write($elm);
  • 我将 $mock->expects($this->at(0)) 替换为 $mock->expects($this->once())

  • 测试通过绿色

    有什么我不明白的吗?

    编辑:

    $mock->expects($this->at(3))
    ->方法('读')
    ->will($this->returnValue('tototatatiti'));

    => 将使测试通过绿色...

    最佳答案

    根据 PHPUnit source code我们有:

    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
    {
    $this->currentIndex++;

    return $this->currentIndex == $this->sequenceIndex;
    }

    每次 PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex尝试匹配调用, protected 变量 $currentIndex递增,因此您首先调用 write 使其变为 0,然后它与 read 不匹配.

    第二个电话,到 read导致该值变为 1,因此它也不匹配。

    看起来它确实适用于整个对象,如果您需要确保一系列调用以特定顺序发生,这非常有用。

    例如,假设 write方法只被调用一次,你可以有类似的东西:
    $mock->expects($this->at(0))
    ->method('write');

    $mock->expects($this->at(1))
    ->method('read')
    ->will($this->returnValue('tototatatiti'));

    这确保了 write方法确实在 read 之前被调用方法。

    关于带有 at() 功能的 PHPUNIT 模拟工作很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16195594/

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