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



当尝试根据这里的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 PHPUnitFrameworkTestCase;
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。为什么会这样,我怎样才能成功地模拟函数的返回值?

您应该使用$stub对象而不是A类,以获得存根函数结果。您应该使用非静态方法来使用它。

<?php 
declare(strict_types=1);
use PHPUnitFrameworkTestCase;
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)

相关内容

  • 没有找到相关文章

最新更新