当尝试根据这里的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
(因为$stub
是A&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)