Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CakePHP] Testowanie komponentu
Forum PHP.pl > Forum > PHP > Frameworki
gcdreak
Hej,
Do testów wykorzystuje bazę Sqlite tworzoną w pamięci.

W komponencie mam taki kod
  1. class TicketComponent extends Component
  2. {
  3. protected $ticketValidityPeriodInHours = 24;
  4.  
  5. public function initialize(array $config)
  6. {
  7. parent::initialize($config);
  8. $this->TicketsTable = TableRegistry::get('Tickets');
  9. }
  10. public function generateTicket($data = null)
  11. {
  12. $ticket = $this->TicketsTable->newEntity();
  13. $ticket->expires = date(
  14. DB_DATE_TIME,
  15. strtotime(sprintf('+%d hours', $this->ticketValidityPeriodInHours))
  16. );
  17. $ticket->data = $data;
  18. $ticket->hash = $this->generateRandomHash();
  19.  
  20. return $this->TicketsTable->save($ticket);
  21. }
  22. // Inne metody
  23. }


Teraz chciałbym napisać do tego komponentu test. Wstępnie wygląda to następująco
  1. class TicketComponentTest extends TestCase
  2. {
  3. public $component = null;
  4. public $controller = null;
  5.  
  6. public function setUp()
  7. {
  8. parent::setUp();
  9.  
  10. $request = new Request();
  11. $response = new Response();
  12. $this->controller = $this->getMock(
  13. 'Cake\Controller\Controller',
  14. null,
  15. [$request, $response]
  16. );
  17. $registry = new ComponentRegistry($this->controller);
  18. $this->component = new TicketComponent($registry);
  19. }
  20.  
  21. public function testGenerateTicket()
  22. {
  23. $ticket = $this->component->generateTicket();
  24.  
  25. $this->assertInstanceOf(Ticket::class, $ticket, 'Returns Ticket object');
  26. $this->assertTrue(strtotime($ticket->expires) > time(), 'Expiry time is from future');
  27. $this->assertNotEmpty($ticket->hash, 'Hash is not empty');
  28. }
  29. }

Kiedy odpalam phpunit uczywiście dostaję błąd
Cannot describe tickets. It has 0 columns.
Jest to zrozumiałe - tabela nie istnieje w testowej bazie
Czy ktoś mógłby mi pokazać jak zrobić mock-a by zastąpić użycie TicketsTable bym mógł swobodnie testować TicketComponent lub jak iżyć Fixture w tym wypadku.
Dziękuję za pomoc
kicaj
To jest Cake 3
gcdreak
Kolego dziękuje, ale doskonale znam tą część z manuala, tylko niestety nie wiem jak zrobić to o czym piszę w pierwszym poście.
Może ktoś wie jak to zrobić?
markuz
Utwórz TicketsFixture jak w dokumentacji i dodaj
  1. public $fixtures = ['app.tickets'];
w TicketComponentTest
Riggs
Możesz nie mieć samej struktury tabeli (oprócz fixtures które są rekordami). Warto robić taki import (bo jak dasz w polach fields to przy update'ach można zapomnieć zaktualizować schematu w testach jeśli nie korzystasz z TDD):
  1. class TicketsFixture extends TestFixture
  2. {
  3. public $import = ['table' => 'tickets'] ; //Tu nazwa twojej tabeli z ticketami
  4. }
gcdreak
Działa!
Dziękuję za pomoc
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.