#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