Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHPUnit][PHP7.1] Działanie typów zwracanych w PHPUnit
Forum PHP.pl > Forum > PHP
czychacz
Cytat
G:\htdocs\project>.\vendor\bin\phpunit
PHP Fatal error: Cannot use 'null' as class name as it is reserved in G:\htdocs
\project\src\Named\NamedTrait.php on line 32


Na taki błąd natknąłem się dzisiaj, gdy chciałem napisać testy jednostkowe dla mojej aplikcaji. Podobnymi błędami rzuca w przypadku typu void.
Czy to standardowy błąd PHPUnit, czy może trzeba po prostu coś inaczej zrobić?
Pyton_000
My nie wróżki, kod pokaż który testujesz i test
czychacz
  1. <?php
  2.  
  3. namespace Project\Named;
  4.  
  5. trait NamedTrait
  6. {
  7.  
  8. /**
  9.   * Table name
  10.   *
  11.   * @var string
  12.   */
  13. protected $name;
  14.  
  15. public function __construct(string $name)
  16. {
  17. $this->setName($name);
  18. }
  19.  
  20. public function getName(): string
  21. {
  22. return $this->name;
  23. }
  24.  
  25. protected function setName(string $name): void
  26. {
  27. $this->name = $name;
  28. }
  29. }

  1. <?php
  2.  
  3. namespace Project;
  4.  
  5. use Project\Named\NamedTrait;
  6.  
  7. class Table
  8. {
  9.  
  10. use NamedTrait {
  11. NamedTrait::__construct as protected namedConstruct;
  12. }
  13.  
  14. public function __construct($name)
  15. {
  16. $this->namedConstruct($name);
  17. }
  18. }
  1. <?php
  2.  
  3. use PHPUnit\Framework\TestCase;
  4. use Project\Table;
  5.  
  6. class TableTest extends TestCase
  7. {
  8.  
  9. const TABLE_NAME_TEST = 'test';
  10.  
  11. /**
  12.   * @dataProvider providerTable
  13.   */
  14. public function testTable(Table $table)
  15. {
  16. $this->assertInstanceOf(\Project\Table::class, $table);
  17. $this->assertEquals(self::TABLE_NAME_TEST, $table->getName());
  18. }
  19.  
  20. public function providerTable()
  21. {
  22. return array(
  23. new Table(self::TABLE_NAME_TEST)
  24. )
  25. );
  26. }
  27. }


Dla
  1. NamedTrait::setName(string $name): void
dostaję błąd:
Cytat
The data provider specified for TableTest::testTable is invalid.
Return value of HaruDb\Table::setName() must be an instance of HaruDb\Named\void
, none returned

Jeśli zmienię zwracany typ na null, to dostaję komunikat z pierwszego postu.

Podałem informację o namespace HaruDb - taki jest namespace po przeróbkach kodu.

Cytat
Time: 40 ms, Memory: 4.00MB

There was 1 warning:

1) Warning
The data provider specified for TableTest::testTable is invalid.
Return value of Project\Table::setName() must be an instance of Project\Named\vo
id, none returned

WARNINGS!
Tests: 1, Assertions: 0, Warnings: 1.
com
a gdzie declare(strict_types=1);
Pyton_000
Deklarując `:void` musisz dać return.
markuz
Upewnij się, że odpalasz to na php 7.1

@Python void jest właśnie od tego żeby return nie musiało być smile.gif [chyba]
Pyton_000
Taki duży a dokumentacji nie czyta wink.gif
http://php.net/manual/en/migration71.new-f....void-functions
markuz
@Python czytałem to zanim napisałem post, może mój angielski po prostu szwankuje ale:
Cytat
Functions declared with void as their return type must either omit their return statement altogether, or use an empty return statement.

Czy to nie oznacza, że funkcje zdeklarowane z void jako return type muszą albo pomijać return całkowicie albo używać pustego return;?
Pyton_000
Racja. W sumie sam nie doczytałem smile.gif

aa dobra... Pewnie masz PHP 7.0, a ten feature jest od 7.1

Przed chwilą sprawdziłem i na 7.1.5
  1. <?php
  2. declare(strict_types=1);
  3.  
  4. function test():void {
  5. echo 'aa';
  6. }
  7.  
  8. test();

działa, a na 7.0 się wywala.
com
void to void nic nie zwraca tongue.gif
czychacz
Nagłówek z phpinfo();
Cytat
PHP Version 7.1.4


Poza tym sam kod php poza PHPUnit śmiga bez zarzutów.
  1. declare(strict_types=1);

Ta deklaracja powinna być w każdym pliku? Po kiego grzyba coś takiego?

Skrypt z jakiegoś powodu działa nawet bez niej :E
com
to w końcu działa czy nie działa, a no poto żeby php wiedział czy trzymasz się typów czy nie
czychacz
Cytat(czychacz @ 26.05.2017, 18:57:49 ) *
Poza tym sam kod php poza PHPUnit śmiga bez zarzutów.

Wyraźnie napisałem, że POZA PHPUnit wszystko działa.
Czyli PHPUnit nie działa - chyba logiczne.
com
Nie zauważyłem wink.gif
Jaka wersja PHPUnit?
nospor
Cytat
Poza tym sam kod php poza PHPUnit śmiga bez zarzutów.

Jak dla mnie, to kod ci dziala gdy odpalasz go przez przegladarke a nie dziala ci gdy odpalasz go z konsoli.
Wniosek jest dosc oczywisty: w konsoli masz inne php niz w na serwerze www
czychacz
Faktycznie, zapomniałem zmienić PATH po instalacji PHP 7.1
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.