如果数组是在setUp方法中初始化的,则在测试函数中将值添加到Symfony TestCase类中的数组

问题描述 投票:0回答:1

如果问题看起来不太对劲,我很抱歉,我对 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
为指向数组的指针,但这似乎不可能?

php arrays symfony pass-by-reference prophecy
1个回答
0
投票

可以返回参考。已针对 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());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.