• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pisanie testów

Object Storage Arubacloud
0 głosów
161 wizyt
pytanie zadane 20 kwietnia 2020 w PHP przez michal_php Stary wyjadacz (13,700 p.)

Cześć.

Uczę się pisać test TDD. I mam jedne problem , którego nie wiem jak przeskoczyć. Otóż mam taki kod:

 public function testShouldReturnTrueWeCheckWithFullyTable()
   {
       // Given
       $checkExist = new CheckExist();
       $task = new Task();
       $taskChildren = new TaskChildren();

       // When
       $task->setTaskChildren($taskChildren);
       $result = $checkExist->next($task);

       // Then
       $this->assertEquals(true,$result);
   }

I testuje :

 public function next(Task $task = null)
    {
        $next = false;
        if ($task){
            foreach ($task->getTaskChildren() as $item){
                if ($item){
                    $next = true;
                }
            }
        }
        return $next;
    }

I Problem w tym ,że ciągle wywala mi błędy, że muszę zaimplementować Doctrina:

1) App\Tests\Model\Task\CheckExistTest::testShouldReturnTrueWeCheckWithFullyTable
TypeError: Return value of App\Entity\Task::getTaskChildren() must implement interface Doctrine\Common\Collections\Collection, instance of App\Entity\TaskChildren returned

C:\eco\tdd\src\Entity\Task.php:189
C:\eco\tdd\src\Model\CheckExist.php:14
C:\eco\tdd\tests\Model\Task\CheckExistTest.php:37

Z góry dziękuje za pomoc lub jakąś wskazówkę.

1 odpowiedź

+1 głos
odpowiedź 20 kwietnia 2020 przez HaKIM Szeryf (87,590 p.)
Błąd nie jest o tym, że musisz "zaimplementować doctrine'a", a o tym, że zwracany typ Task::getTaskChildren nie zgadza się z przez Ciebie ustalonym.

Zmień zwracany typ w metodzie getTaskChildren na klasę Task i wszystko będzie okej, jeśli chodzi o ten błąd.
komentarz 20 kwietnia 2020 przez michal_php Stary wyjadacz (13,700 p.)

Rozumiem ,że chodzi o coś takiego :

 /**
     * @return Task
     */
    public function getTaskChildren(): Task
    {
        return $this->taskChildren;
    }

    /**
     * @param mixed $taskChildren
     */
    public function setTaskChildren($taskChildren): void
    {
        $this->taskChildren = $taskChildren;
    }

Daje zwraca ten błąd 

komentarz 20 kwietnia 2020 przez michal_php Stary wyjadacz (13,700 p.)
Dobra działa moja wina.

A mam pytanie jak wpływa(albo co zmienia) ,że Task::getTaskChildren tutaj jest Collection albo klasa TaskChildren jako metoda ?
komentarz 20 kwietnia 2020 przez HaKIM Szeryf (87,590 p.)

Wybacz, ale nie rozumiem Twojego pytania w formie w jakim zostalo ono zadane.

Pozwól więc, że założę, że pytasz "Jaki ma wpływ zwracany typ na poprawne działanie kodu", na co pozwolę sobie podlinkować dokumentację:

https://www.php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

komentarz 20 kwietnia 2020 przez michal_php Stary wyjadacz (13,700 p.)

Dobra trochę zawile opisałem problem. Chodzi mi o to ,że jak jak na przykład wezmę doctrina aby wyciągnął mi konkretny rektor z bazy danych i zrobię dumpa to mam coś takiego :

^ App\Entity\Task {#831 ▼
  -id: "1eOF13soDOV8ajpq6ZDtlbHErvk6Z9xfY"
  -task: "Id architecto."
  -description: "Voluptate architecto mollitia corporis. Placeat hic aut voluptatem quae possimus fugiat enim."
  -createdAt: DateTime @1587117016 {#834 ▶}
  -finishAt: null
  -dedlineAt: DateTime @1586885217 {#833 ▶}
  -users: Proxies\__CG__\App\Entity\User {#931 ▶}
  -status: 3
  -taskChildren: Doctrine\ORM\PersistentCollection {#961 ▼
    -snapshot: []
    -owner: App\Entity\Task {#831}
    -association: array:15 [ …15]
    -em: Doctrine\ORM\EntityManager {#250 …11}
    -backRefFieldName: "task"
    -typeClass: Doctrine\ORM\Mapping\ClassMetadata {#932 …}
    -isDirty: false
    #collection: Doctrine\Common\Collections\ArrayCollection {#869 ▶}
    #initialized: false
  }
  -guardian: Proxies\__CG__\App\Entity\User {#931 ▶ …2}
  -taskRound: Doctrine\ORM\PersistentCollection {#956 ▶}
}

Ale jak teraz chcę coś takiego sam zbudować za pomocą :

$task = new Task();
$children = new TaskChildren();
$task->setTaskChildren($children);

to dostaje nieco inny obiekt:

^ App\Entity\Task {#729 ▼
  -id: "kppkuxX7A89OBbc0zFMctAxHdxt3F9GJS"
  -task: null
  -description: null
  -createdAt: DateTime @1587380710 {#761 ▶}
  -finishAt: null
  -dedlineAt: null
  -users: null
  -status: null
  -taskChildren: App\Entity\TaskChildren {#746 ▼
    -id: "oDwUwzrDZ3uhm7pF4QY2F0VUkXCRGZMvt"
    -title: null
    -description: null
    -createdAt: DateTime @1587380710 {#749 ▶}
    -link: null
    -childrenLink: null
    -task: null
    -status: 1
    -deadLineAt: null
  }
  -guardian: null
  -taskRound: Doctrine\Common\Collections\ArrayCollection {#777 ▶}
}

I ten stworzony ręcznie nie zachowuje się tak jak ten z doctrina. I pytanie czy mogę ręcznie utworzyć tak samo zbudowany obiekt jaki mi buduje doctrine ?

komentarz 20 kwietnia 2020 przez HaKIM Szeryf (87,590 p.)
Możesz, ale skąd taka potrzeba?

Do czego jest Ci potrzebny 1:1 obiekt z doctrine w teście jednostkowym (eng. unit test)?
komentarz 20 kwietnia 2020 przez michal_php Stary wyjadacz (13,700 p.)

Chce przetestować coś takiego czy dostane wartość true :

public function next(Task $task = null)
   {
       $next = false;
       if ($task){
           foreach ($task->getTaskChildren() as $item){
               if ($item){
                   $next = true;
               }
           }
       }
       return $next;
   }

I w sumie tylko po to chciałem zrobić taki obiekt aby to przetestować. Czy może jest łatwiejszy sposób a ja sobie tylko utrudniam ?

Podobne pytania

0 głosów
1 odpowiedź 112 wizyt
pytanie zadane 18 kwietnia 2020 w PHP przez michal_php Stary wyjadacz (13,700 p.)
0 głosów
0 odpowiedzi 152 wizyt
+2 głosów
1 odpowiedź 610 wizyt

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...