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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHPUnit:如何通过测试方法模拟内部调用的函数相关的知识,希望对你有一定的参考价值。

在下面的例子中,我想模仿在getBaseValue()中调用multipliedValue()。但我无法弄明白。

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);
  }
}

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

我目前得到的错误是$this方法中的multipliedValue(),它将其视为存根对象。

答案

->setMethods()中列出的所有方法都将被存根并默认返回null,因此如果您只想存根getBaseValue,那么:

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

以上是关于PHPUnit:如何通过测试方法模拟内部调用的函数的主要内容,如果未能解决你的问题,请参考以下文章

PHPUnit 如何获得模拟方法的真实返回值?

PHPUnit:如何使用多个参数模拟多个方法调用?

如何在 PHPUnit 中跨多个测试模拟测试 Web 服务?

在 PHPUnit 中调用路由时如何在 Laravel 8 中模拟 Eloquent 模型

如何使用 PHPUnit 在类中测试单个 void 方法?

是否有可能使用 PHPUnit 模拟对象来调用一个神奇的 __call() 方法?