Przede wszystkim miej nadzieję, że pomogę Ci rozwiązać Twój problem, ponieważ jestem prawie pewien, że to głupi błąd, który popełniasz gdzieś w związku.
Oto kilka wskazówek:
Nie testuj swojego kodu "wywołującego" podstawowy kod frameworka...
Zamiast robić (testy jednostkowe):
$request = new Request();
$request->DEF_NOM = 'test';
$request->DEF_DESCRIPTION = 'testdescriptio ajhsg ln';
$request->DEF_NBSEMAINES = 2;
$request->DEF_CONSEILS = 'jhasnciu launh sl';
$request->DEF_VISIBLE = 1;
$request->DEF_DATE_VISIBLE = Carbon::now()->toDate();
$request->COA_ID = 3;
$dfc = new DefiCoachController();
$response = $dfc->createDefiTest($request);
$this->assertDatabaseHas('cbs_defis', $request->all());
Wykonaj (test funkcji):
$data = [
'nom' => 'test',
'description' => 'testdescriptio ajhsg ln',
'nbsemaines' => 2,
'conseils' => 'jhasnciu launh sl',
'visible' => 1,
'date_visible' => Carbon::now()->toDate(),
'coa_id' => 3,
];
$response = $this->post('your_desired_url_for_this_action', $data); // This can be get, post, put or delete
$this->assertDatabaseHas('cbs_defis', $data);
W ten sposób możesz mieć pewność, że:
- Twój adres URL jest taki, jaki chcesz, bez literówek i błędów
- Kontroler robi to, co powinien, w tym przypadku wstawia dane.
- Kontroler wstawia dane, które chcesz wstawić. Powiedzmy, że masz jakieś przetwarzanie za zasłonami, tutaj możesz upewnić się, że wysłałeś "1 i 3" i wstawiłeś "rolę X" (jest to przykład, powiedzmy, że byłby to twój pożądany wynik po przetworzeniu 1 i 3, więc nie wstawiasz bezpośrednio
1 i 3
) - zawsze unikaj potwierdzanie danych z miejsca, w którym je testujesz. W Twoim przypadku używasz
Prośba
obiekt, powiedzmy, że jest to twoja niestandardowa klasa i robisz coś, gdy robisz$request->attribute1 =2
, więc po odczycie jako$request->attribute1
może wykonałeś jakiś proces, aby go zapisać i zmodyfikowałeś go ... jeśli twierdzisz, że bez wyraźnego powiedzeniapotwierdź, że atrybut1 jest tym, czego oczekuję
nigdy tego nie potwierdzasz. Jeśli masz błąd w kodzie i zamiast zwracaćb
(1
=a
,2
=b
, itp.) kod zawsze przejdzie, ponieważ zapisałeś go jako coś innego niż oczekiwano, ale potwierdzasz to, co zrobił (powiedzmy, że twój błąd zwróciłc
zamiastb
), więc mówisz „znajdź$request->attribute1
w bazie danych" i będziesz przechowywałc
zamiastb
(Twoja oczekiwana wartość), a nadal ją znajdzie i zda test.
Nie ma potrzeby tworzenia nowego połączenia
jeśli jest taki sam z wyjątkiem DB_DATABASE
lub podobne. W takim przypadku wystarczy zdefiniować te informacje w .env.testing
lub w swoim phpunit.xml
.
Ponadto nie trzeba wykonywać
i
. Jeśli zobaczysz phpunit.xml
Laravela GitHub , zobaczysz, że zmienili
do
Upewnij się więc, że ustawiłeś właściwy DB_HOST
, DB_PORT
, DB_USERNAME
i DB_PASSWORD
. Możesz mieć ten sam host, ale inny port lub możesz mieć ten sam host i port, ale inną nazwę bazy danych, ale tę samą nazwę użytkownika i hasło. Upewnij się więc, że łączysz się z właściwą bazą danych.
Ponieważ twoim błędem jest to, że nie może znaleźć żądanej tabeli, najwyraźniej łączysz się z bazą danych, więc nazwa użytkownika i hasło nie powinny być twoim problemem, ale tabela nie istnieje.
Ostatnia ważna rzecz, czy używasz jakiejś cechy w swoich testach? Istnieje kilka cech umożliwiających automatyczną migrację bazy danych i wycofanie jej po zakończeniu, więc nie ma potrzeby ręcznego synchronizowania migracji w środowisku testowym. Powinieneś używać użyj RefreshDatabase;
aby to zrobić.
Ostatnia wskazówka, staraj się unikać robienia DEF_SOMETHING
ponieważ:
- Jeśli twój kontroler jest powiązany z
Defi
, nie trzeba mówić "to są dane DEF", już wiemy, więc możesz bezpośrednio zrobićcoś
. To samo dla bazy danych, jeśli nazwa tabeli tosamochody
, unikaj wykonywaniacar_wheels
,drzwi_samochodu
itp., wykonajkoła
,drzwi
itp. - Unikaj wykonywania
X_Y
, wolę zrobićx_y
, tak samo dla bazy danych. Zawsze używaj małych liter, aw przypadku bazy danych trzymaj sięsnake_case
, ale dla atrybutów modeli zawsze trzymaj sięcamelCase
. (więcej informacji o przypadkach)