Dlaczego, błąd krytyczny: nie znaleziono klasy „PHPUnit_Framework_TestCase” w…?

127

Dlaczego otrzymuję ten błąd PHP?

Fatal error: Class 'PHPUnit_Framework_TestCase' not found in ...
Alvin
źródło
9
W ogóle nie podajesz żadnych informacji.
Pekka
Uruchom testy za pomocą wiersza poleceń phpunit. Ładuje niezbędne zajęcia.
Halfstop
Możesz również użyć odpowiedzi z następującej odpowiedzi stackoverflow.com/questions/42811164/ ..., aby zachować zgodność kodu z PHPUnit 6, jak również z wcześniejszymi wersjami.
Robson

Odpowiedzi:

73

Dokumentacja PHPUnit mówi, że zawiera / wymaga PHPUnit / Framework.php, w następujący sposób:

require_once ('PHPUnit/Framework/TestCase.php');

AKTUALIZACJA

Od PHPUnit 3.5 jest wbudowana klasa autoloadera, która zajmie się tym za Ciebie:

require_once 'PHPUnit/Autoload.php';

Dzięki dla Phoenix za wskazanie tego!

definiuje
źródło
14
PHPUnit 3.5 jest dostarczany z własnym autoloaderem, który może pomóc require_once 'PHPUnit/Autoload.php'
1
Zgadzam się, że require_once ('PHPUnit / Autoload.php') jest najlepszą praktyką.
Paul Maidment,
1
Nie mam oba PHPUnit/Autoload.phpi PHPUnit/Framework/TestCase.phpmój folder jest coś w rodzajuPHPUnit/Framework/MockObject
Sufendy
4
a teraz mam PHP Fatal error: require_once(): Failed opening required 'PHPUnit/Autoload.php'
Dennis
1
zobacz odpowiedź @ shadi na PHP 6+ stackoverflow.com/a/42561590/2883328
Dennis
237

Dla tych, którzy przyjeżdżają tutaj po aktualizacji phpunita do wersji 6 lub nowszej wydanej w dniu 2017-02-03 (np. W przypadku programu composer), może pojawić się ten błąd, ponieważ kod phpunita ma teraz przestrzeń nazw (sprawdź dziennik zmian ).

Trzeba będzie byłaby rzeczy, jak \PHPUnit_Framework_TestCasena\PHPUnit\Framework\TestCase

shadi
źródło
4
Dzięki, miałem ten problem, ponieważ Travis CI używał najnowszej wersji PHPUnit w swoich kompilacjach PHP 7. Moją poprawką było ręczne pobranie starego phara i użycie go zamiast tego.
DisgruntledGoat
2
github.com/sebastianbergmann/phpunit/wiki/ ... jest na górze informacji o wydaniu, ale przegapiłem to
Qchmqs
Dziękuję uprzejmie, dobry panie. Rzeczywiście przybywam tutaj po aktualizacji do wersji 6.
h4ckNinja
Byłem naprawdę zirytowany, że moje testy nagle przestały działać. Zrobiłem aktualizację kompozytora i zaktualizowałem mój PHPunit do wersji 6.1. Dziękuję Ci.
Jed Lynch
38

W przypadku wyższej wersji phpunita, takiej jak 6.4, musisz użyć przestrzeni nazw PHPUnit \ Framework \ TestCase

użyj TestCase zamiast PHPUnit_Framework_TestCase

// use the following namespace
use PHPUnit\Framework\TestCase;

// extend using TestCase instead PHPUnit_Framework_TestCase
class SampleTest extends TestCase {

}
Jijesh Cherrai
źródło
Świetnie, to zadziałało dla mnie, ponieważ korzystałem ze starego samouczka
właśnie skopiowałeś odpowiedź Shadiego
Adam
@Adam, kto jest shadi?
Jijesh Cherrai,
Nie wiem czegoś takiego. Mam ten sam błąd, a następnie sprawdzam odpowiedź, łamiąc pakiet
Jijesh Cherrai
13

Możesz otrzymać ten błąd, ponieważ utworzyłeś przestrzeń nazw pliku. Jeśli tak, musisz określić, że PHPUnit_Framework_TestCase znajduje się w globalnej przestrzeni nazw, poprzedzając ją odwrotnym ukośnikiem:

namespace AcmeInc\MyApplication\Tests
class StackTest extends \PHPUnit_Framework_TestCase {}

Złożyłem prymitywny PR, aby rozpocząć rozmowę o poprawieniu dokumentacji .

Bevan
źródło
1
Tak, jeśli zrobiłeś to: class YourNiceTest extends PHPUnit_Framework_TestCasepo prostu dodaj \ przed klasą rozszerzoną, jak w class YourNiceTest extends \PHPUnit_Framework_TestCase- To zadziałało dla mnie, używając Symfony 2.8i włączając do phpunitpliku kompozytora pobranego jako zależność lokalna z"phpunit/phpunit": "^4.8"
Xavi Montero
12

Przeprowadzałem testy PHPUnit na PHP5, a potem musiałem również obsługiwać PHP7. Oto co zrobiłem:

W pliku composer.json:

"phpunit/phpunit": "~4.8|~5.7"

W moim pliku bootstrap PHPUnit (w moim przypadku /tests/bootstrap.php):

// PHPUnit 6 introduced a breaking change that
// removed PHPUnit_Framework_TestCase as a base class,
// and replaced it with \PHPUnit\Framework\TestCase
if (!class_exists('\PHPUnit_Framework_TestCase') && class_exists('\PHPUnit\Framework\TestCase'))
    class_alias('\PHPUnit\Framework\TestCase', '\PHPUnit_Framework_TestCase');

Innymi słowy, zadziała to w przypadku testów napisanych pierwotnie dla PHPUnit 4 lub 5, ale później również potrzebne do pracy z PHPUnit 6.

Nino Škopac
źródło
1
Rozwiązanie to ważne, jeśli chcesz, aby nie dotknąć kod civi \ test ale trzeba kompatybilny z najnowszym badaniu jednostkowych php oparty nazw
Shahadat Hossain Khan
6

Możesz po prostu zainstalować PHPUnit, aby uruchamiać polecenia ( https://github.com/sebastianbergmann/phpunit/#php-archive-phar ):

wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
mv phpunit.phar /usr/local/bin/phpunit

Uruchom pojedynczy test

Następnie uruchom test PHPunit:

phpunit test.php

Zawartość pliku testowego jest następująca:

<?php

class StackTest extends PHPUnit_Framework_TestCase
{
    protected function setUp()
    {
    }

    public function testSave()
    {

    }
}

Uruchom zestaw testów

Konfiguracja zestawu testów: demosuite.xml. demoto katalog zawierający wszystkie testy. Pliki testowe muszą mieć nazwę *_test.php( suffix).

<testsuites>
    <testsuite name="DemoTestSuite">
        <directory suffix="test.php">demo</directory>
    </testsuite>
</testsuites>

Zestaw testów działa z następującymi poleceniami:

phpunit -c demosuite.xml --testsuite DemoTestSuite
radeklos
źródło
3
To już nie działa, ponieważ ostatnio uruchamiane PHPUnit nie obsługuje już starych nazw klas, takich jak PHPUnit_Framework_TestCase. Naprawdę musisz użyć... extends PHPUnit\Framework\TestCase
Mikko Rantalainen
Po prostu mówię, że musiałem najpierw, mv phpunit /usr/local/bin/phpunita potem sudo chmod +x /usr/local/bin/phpunit. Ustawienie pliku jako wykonywalnego przed przeniesieniem nigdy nie działało na Vagrant Ubuntu. Nie mam pojęcia, dlaczego ... Ale na wypadek, gdyby ktoś się z tym zmagał, mam nadzieję, że to pomoże.
George Mylonas
4

Założenie:

Phpunit (3.7) jest dostępny w środowisku konsoli.

Akcja:

Wpisz w konsoli następującą komendę:

SHELL> phpunit "{{PATH TO THE FILE}}"

Uwagi:

Nie musisz niczego dołączać do nowych wersji PHPUnit, chyba że nie chcesz działać w konsoli. Na przykład uruchamianie testów w przeglądarce.

svirk
źródło
1

Używam ZF2 i pracuję dla mnie po zastąpieniu „PHPUnit_Framework_TestCase” na „\ PHPUnit \ Framework \ TestCase”

Alysson Vicuña de Oliveira
źródło
0

Jeśli masz Centosa lub inną dystrybucję Linuksa, musisz zainstalować pakiet phpunit, zrobiłem to za pomocą yum install phpunit i zadziałało. Może trzeba będzie dodać repozytorium, ale myślę, że musi działać płynnie z domyślnymi (mam CentOS 7)

Ricardo Herrero
źródło
0

Możliwe, że przeprowadzasz podstawowe testy WordPress i niedawno zaktualizowałeś swój PhpUnit do wersji 6. Jeśli tak jest, to ostatnia zmiana w przestrzeni nazw w PhpUnit zepsuje twój kod.

Na szczęście na https://core.trac.wordpress.org/changeset/40547 dostępna jest łatka do podstawowych testów, która obejdzie problem. Zawiera także zmiany w travis.yml, których możesz nie mieć w swojej konfiguracji; jeśli tak jest, musisz edytować plik .diff, aby zignorować poprawkę Travisa.

  1. Pobierz poprawkę „Unified Diff” znajdującą się na dole strony https://core.trac.wordpress.org/changeset/40547
  2. Edytuj plik poprawki, aby usunąć część Travisa z łatki, jeśli tego nie potrzebujesz. Usuń od początku pliku do miejsca tuż nad tą linią:

    Index: /branches/4.7/tests/phpunit/includes/bootstrap.php
  3. Zapisz różnicę w katalogu nad katalogiem / obejmuje / - w moim przypadku był to sam katalog Wordpress

  4. Użyj narzędzia łatki Unix, aby załatać pliki. Będziesz także musiał usunąć kilka pierwszych ukośników, aby przejść z bezwzględnej do względnej struktury katalogów. Jak widać z punktu 3 powyżej, przed katalogiem include znajduje się pięć ukośników, których flaga -p5 zostanie usunięta.

    $ cd [WORDPRESS DIRECTORY]
    $ patch -p5 < changeset_40547.diff 

Po wykonaniu tej czynności moje testy ponownie przebiegły poprawnie.

piersb
źródło
0

UWAGA: Polecenie php bin/console generate:doctrine:crudrównież tworzy TestControllerw, src/Testswięc może zgłaszać błąd podczas próby uruchomienia serwera, jeśli go nie masz UnitTests. Usuń plik, napraw to!

MorganFreeFarm
źródło
0

Dla mnie to dlatego, że biegałem

$ phpunit .

zamiast

$ phpunit

kiedy miałem już skonfigurowany phpunit.xmlplik w katalogu roboczym.

cyberbit
źródło
0

Używam php 5.6 w oknie 10 z wersją zend 1.12 do dodania

require_once 'PHPUnit / Autoload.php';

przed

Klasa abstrakcyjna Zend_Test_PHPUnit_ControllerTestCase rozszerza PHPUnit_Framework_TestCase

pracował. Musimy dodać powyższą instrukcję w pliku ControllerTestCase.php

Shankar
źródło