如果问题看起来不太对劲,我很抱歉,我对 Stack Overflow 和 php 都是新手。
我的班级看起来有点像这样:
final class MyClass extends TestCase
{
private MyService $myService;
private ObjectProphecy $object;
private array $x;
protected function setUp(): void
{
$this->object = $this->getProphet()->prophesize(MyOtherClass::class);
$this->x = [];
$this->object->foo()->willReturn($this->x);
}
public function test(): void
{
$this->x = [1];
$this->myService->bar();
}
}
问题是,在
$this->myService->bar();
的调用中,在执行 object->foo()
时,我得到 []
,它是在 setUp()
方法中设置的,我希望它是 [1]
。
我怀疑这是因为
$this->object->foo()->willReturn($this->x);
复制了 $this->x
,然后没有注意到我后来所做的更改。但是,如果我将 $x
更改为某个对象而不是数组,则一切都会按照我的预期工作。
处理这个问题最干净的方法是什么?我希望能声明
$x
为指向数组的指针,但这似乎不可能?
可以返回参考。已针对 PHPUnit 10.3 进行测试。
<?php declare(strict_types=1);
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;
// Never used, but neccessary to have a class to be able to create a mock
class MyFoo {
public function foo(): array
{
var_dump('called foo()');
return ['foo'];
}
}
final class ReturnTest extends TestCase
{
private MockObject $mock;
private array $x;
protected function setUp(): void
{
$this->x = [];
$this->mock = $this->createMock(MyFoo::class);
$this->mock->method('foo')->willReturnReference($this->x);
}
public function test(): void
{
$this->assertEquals([], $this->mock->foo());
$this->x = [1];
$this->assertEquals([1], $this->mock->foo());
}
}