Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Masalah dengan pengujian database laravel 7.x

Pertama-tama, saya harap saya dapat membantu Anda memperbaiki masalah Anda karena saya yakin ini adalah kesalahan konyol yang Anda buat di suatu tempat dalam koneksi.

Jadi, ini beberapa tipsnya:

Jangan menguji kode Anda "memanggil" kode kerangka kerja inti...

Alih-alih melakukan (pengujian unit):

$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());

Lakukan (uji fitur):

$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);

Dengan cara ini, Anda dapat memastikan bahwa:

  1. URL Anda adalah yang Anda inginkan, tanpa kesalahan ketik atau kesalahan apa pun
  2. Pengontrol melakukan apa yang seharusnya dilakukan, memasukkan data dalam kasus ini.
  3. Pengontrol memasukkan data yang ingin Anda sisipkan. Katakanlah Anda memiliki beberapa pemrosesan di balik tirai, di sini Anda dapat memastikan bahwa Anda mengirim "1 dan 3" dan itu memasukkan "peran X" (ini adalah contoh, katakanlah itu akan menjadi hasil yang Anda inginkan setelah memproses 1 dan 3, jadi Anda tidak langsung memasukkan 1 dan 3 )
  4. selalu hindari menegaskan data dari tempat Anda mengujinya. Dalam kasus Anda, Anda menggunakan Request objek, katakanlah itu adalah kelas khusus Anda, dan Anda melakukan sesuatu ketika Anda melakukan $request->attribute1 =2 , jadi ketika Anda membacanya kembali sebagai $request->attribute1 mungkin Anda telah melakukan beberapa proses untuk menyimpannya dan Anda telah memodifikasinya... jika Anda menegaskan bahwa tanpa secara eksplisit mengatakan tegaskan bahwa atribut1 adalah apa yang saya harapkan Anda tidak pernah menegaskannya. Jika Anda memiliki kesalahan dalam kode Anda dan bukannya mengembalikan b (1 =a , 2 =b , dll.) kode akan selalu lulus, karena Anda telah menyimpannya sebagai sesuatu yang lain dari yang diharapkan, tetapi Anda menegaskan untuk apa yang telah dilakukan (misalkan kesalahan Anda mengembalikan c bukannya b ) jadi Anda mengatakan "temukan $request->attribute1 di database" dan Anda akan menyimpan c bukannya b (nilai yang Anda harapkan) dan masih akan menemukannya dan lulus ujian.

Tidak perlu membuat koneksi baru jika sama kecuali DB_DATABASE atau serupa. Dalam hal ini, Anda cukup menentukan info itu di .env.testing atau di phpunit.xml . Anda .

Juga, tidak perlu melakukan dan phpunit.xml Laravel GitHub , Anda akan melihat bahwa mereka mengubah ke pada 5.7+, jadi tetap gunakan yang sesuai dengan versi Anda. Ada perbedaan yang saya tidak ingat sekarang, tetapi untuk pengujian, tidak ada masalah.

Jadi, pastikan Anda telah mengatur DB_HOST yang benar , DB_PORT , DB_USERNAME dan DB_PASSWORD . Anda dapat memiliki host yang sama tetapi port yang berbeda, atau Anda dapat memiliki host dan port yang sama tetapi nama database yang berbeda, tetapi nama pengguna dan kata sandi yang sama. Jadi, pastikan Anda terhubung ke database yang benar.

Karena kesalahan Anda adalah tidak dapat menemukan tabel yang diinginkan, jelas Anda terhubung ke database, jadi nama pengguna dan kata sandi seharusnya tidak menjadi masalah Anda, tetapi tabel tidak ada.

Satu hal penting terakhir, apakah Anda menggunakan sifat apa pun pada tes Anda? Ada beberapa ciri untuk memigrasikan database secara otomatis dan memutarnya kembali setelah selesai, jadi Anda tidak perlu menyinkronkan migrasi secara manual di lingkungan pengujian. Anda harus menggunakan use RefreshDatabase; sifat untuk melakukannya.

Tips terakhir, coba hindari melakukan DEF_SOMETHING karena:

  1. Jika pengontrol Anda terkait dengan Defi , tidak perlu mengatakan "ini adalah data DEF", kami sudah tahu, jadi Anda bisa langsung melakukan sesuatu . Sama untuk database, jika nama tabel adalah cars , hindari melakukan car_wheels , pintu_mobil , dll., lakukan roda , pintu , dll.
  2. Hindari melakukan X_Y , lebih suka melakukan x_y , sama untuk database. Selalu gunakan huruf kecil dan, untuk database, gunakan snake_case , tetapi untuk atribut model, selalu gunakan camelCase . (info selengkapnya tentang kasus)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL - Pesan Berdasarkan Id Dalam Urutan DESC, Kelompokkan Berdasarkan X

  2. Menggunakan ALTER untuk menjatuhkan kolom jika ada di MySQL

  3. Cara membaca data tertentu dari hasil mysql di C#

  4. MySQL SEKARANG () berfungsi dengan presisi tinggi

  5. Permintaan MySQL dengan beberapa pernyataan AND tampaknya mengabaikan satu