PHPUnit:如何通过被测方法模拟内部调用的函数

标签 php unit-testing mocking phpunit

在下面的示例中,我想模拟 multipliedValue()getBaseValue() 的调用。但我无法弄清楚。

class Sample
{
    function multipliedValue()
    {
      $value = $this->getBaseValue();
      return $value * 2;
    }

    function getBaseValue()
    {
      return 2;
    }
}

我使用了 PHPUnit 模拟,但没有用。因此,我使用了以下代码:

class SampleTest extends PHPUnit_Framework_TestCase
{
  function testMultipliedValueIfBaseValueIsFalse()
  {
        $mockedObject = $this->getMockBuilder(Sample::class)
            ->setMethods(['multipliedValue', 'getBaseValue'])
            ->getMock();
        $mockedObject->expects($this->any())
            ->method("getBaseValue")
            ->willReturn(false);
        $result = $mockedObject->multipliedValue();
        $this->assertFalse($result);
  }
}

我尝试创建一个全局函数,但只强制其中一个方法返回我想要的值,其余的就按原样进行。我应该如何进行这个测试?

我当前收到的错误是针对 multipliedValue() 方法中的 $this 的,该方法将其视为 stub 对象。

最佳答案

->setMethods() 中列出的所有方法都将被 stub 并默认返回 null,因此如果您只想 stub getBaseValue > 然后执行:

$mockedObject = $this->getMockBuilder(Sample::class)
        ->setMethods(['getBaseValue'])
        ->getMock();
    $mockedObject->expects($this->any())
        ->method("getBaseValue")
        ->willReturn(false);
    $result = $mockedObject->multipliedValue();
    $this->assertFalse($result);

关于PHPUnit:如何通过被测方法模拟内部调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47968579/

相关文章:

PHP/MySQL : How to verify properly escaped data?

unit-testing - 对域类的唯一约束进行单元测试

python - 在 Python 中模拟 ImportError

java - InjectMocks 几次

java - Mockito .thenReturn(list.add()) 实际上向我的列表中添加了一些内容

PHP TCPDF - 如何垂直对齐表格单元格中的文本?

php - 如何使用 CDataProvider 在 Yii 中创建我自己的 DataProvider?

unit-testing - 接口(interface)和单元测试 - 总是白盒测试?

无论缓冲区设置如何,PHP 命令行输出缓冲区输出

java - @Valid不会触发@Repository中的验证