如何在php单元测试中模拟函数的返回值

gr8qqesn  于 2023-01-01  发布在  PHP
关注(0)|答案(1)|浏览(157)

当尝试基于phpunit文档来存根一个简单的函数时,它似乎什么也不做。

<?php declare(strict_types=1);

class A {

    public static function func() {
        $helperData = A::helper();
        return $helperData + 1;
    }

    public static function helper() {
        return 5;
    }
}

试验类别

<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;

final class ATest extends TestCase
{
    public function testFunc(): void
    {
        $stub = $this->createStub(A::class);
        $stub->method('helper')
        ->willReturn(2);

       $result = A::func();
       $this->assertEquals(3, $result); // actual result is 6 not 3--why?
    }
}

存根函数helper没有返回我指定的2,为什么会这样,我怎样才能成功地模拟函数的返回值?

gdrx4gfi

gdrx4gfi1#

你应该使用$stub对象而不是A类来获取stubbed函数结果。你应该使用非静态方法来使用它。

<?php 

declare(strict_types=1);

use PHPUnit\Framework\TestCase;

class A {

    public function func() {
        $helperData = $this->helper();
        return $helperData + 1;
    }

    public function helper() {
        return 5;
    }
}

final class ATest extends TestCase
{
    public function testFunc(): void
    {
        $stub = $this->createStub(A::class);

        $stub->method('helper')
            ->willReturn(2);

        $stub->method('func')
            ->willReturn($stub->helper() + 1);

        
        $result = $stub->func(); // Use `$stub->`
        $this->assertEquals(3, $result); // OK
    }
}

输出:

OK (1 test, 1 assertion)
    • 编辑**

要使用func的原始代码,可以将其设置为静态,并使用A示例作为参数,此A示例可以是$stub(因为$stubA&Stub示例)。

class A {

    public static function func(A $obj) {
        $helperData = $obj->helper();
        return $helperData + 1;
    }

    public function helper() {
        return 5;
    }
}

final class ATest extends TestCase
{
    public function testFunc(): void
    {
        $stub = $this->createStub(A::class);

        $stub->method('helper')
            ->willReturn(2);

        $result = A::func($stub);
        $this->assertEquals(3, $result);
    }
}

输出:

OK (1 test, 1 assertion)

相关问题