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

vptzau2j  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(101)

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

tcomlyy6

tcomlyy61#

有可能返回一个引用.测试PHPUnit 10.3 .

注意事项

这没有用ObjectProphecy测试过,因为它似乎没有实现默认的mocking对象。所以对于这个示例代码,我使用了原生的PHPUnit MockObject

<?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());
    }
}

相关问题