i wrote a sample test case for collection like class but weird thing about this is in my testAdd
method that i add a item in CustomCollectionService
and it changed my parameter too. how can this happend?
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); } }
and this is my test:
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()); } }
Advertisement
Answer
Because it is an object. So when you pass the $col
object to the CollectionService
and call the add
method within the CollectionService
, it is still the $col
object from your test method that is being used.