измените значение параметра зависимого метода в phpunit

#php #phpunit

Вопрос:

я написал примерный тестовый пример для коллекции, такой как класс, но странная вещь заключается в том, что в моем testAdd методе я добавляю элемент, CustomCollectionService и он также изменил мой параметр. как это может произойти?

 class CustomCollectionService
{
/**
 * @var Collection $collection
 */
public $collection;
public function makeCollection($arr)
{
    $this->collection = collect($arr);
}

/**
 * @param Collection $collection
 */
public function setCollection(Collection $collection): void
{
    $this->collection = $collection;
}


/**
 * @return mixed
 */
public function getCollection()
{
    return $this->collection;
}

public function add($item)
{
    return $this->collection->add($item);
}
}
 

и это мой тест:

 class CustomCollectionTest extends TestCase
{
    public $collectionService;
    public  $collection;
    protected function setUp(): void
    {
        $this->collectionService = new CustomCollectionService();
    }

    public function testCollectionCreator()
    {
        $arr = ['sina','1',5];
        $this->assertIsArray($arr);
        return $arr;
    }

    /**
     * @param $arr
     * @depends testCollectionCreator
     */
    public function testAction($arr)
    {
        $this->collectionService->makeCollection($arr);
        $this->assertIsArray($this->collectionService->getCollection()->toArray());
        return $this->collectionService->getCollection();
    }

    /**
     * @depends testAction
     */
    public function testAdd($col)
    {
        $actualCount = $col->count();
        $this->collectionService->setCollection($col);
        $manipulatedCollection = $this->collectionService->add(['xx']);
        dump($actualCount); // 3
        dump($col->count()); //4
        $this->assertEquals($actualCount 1, $manipulatedCollection->count());
    }
}
 

Ответ №1:

Потому что это объект. Поэтому , когда вы передаете $col объект в CollectionService и вызываете add метод внутри CollectionService , все равно $col используется объект из вашего тестового метода.

Комментарии:

1. я передаю $col своему классу, и он в моем классе, и возвращаю его снова в другой переменной . почему параметр был изменен?

2. Потому что `$col-это объект. Какую именно строку кода вы хотите добавить?

3. не могли бы вы объяснить подробнее? я знаю $col , что это объект . эта строка : $manipulatedCollection = $this->collectionService->>добавить([‘xx’]);

4. Поэтому при передаче/возврате объектов в/из функций вы фактически используете один и тот же экземпляр этого объекта (технически не совсем правильно, но достаточно близко). Поэтому, когда вы добавляете элемент в одну функцию, он также добавляется в объект в другом месте. Более подробная информация на этой странице: php.net/manual/en/language.oop5.references.php