Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Problem z testowaniem bazy danych laravel 7.x

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:

  1. Twój adres URL jest taki, jaki chcesz, bez literówek i błędów
  2. Kontroler robi to, co powinien, w tym przypadku wstawia dane.
  3. 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 )
  4. 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 powiedzenia potwierdź, ż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 zamiast b ), więc mówisz „znajdź $request->attribute1 w bazie danych" i będziesz przechowywał c zamiast b (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 na 5.7+, więc trzymaj się tego, który odpowiada twojej wersji. Jest jednak różnica, której teraz nie pamiętam, ale do testowania nie ma problemu.

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ż:

  1. 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 to samochody , unikaj wykonywania car_wheels , drzwi_samochodu itp., wykonaj koła , drzwi itp.
  2. 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)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przenoszenie kolumn tekstowych szerokości/długości geograficznej do kolumny typu „punkt”

  2. JDBC z MySQL jest naprawdę wolny, nie wiem dlaczego

  3. MySQL:Po co używać VARCHAR(20) zamiast VARCHAR(255)?

  4. Klejnot MySQL2 Ruby nie zainstaluje 10.6

  5. Mysql poprawia SELECT prędkość