Trước hết, hy vọng tôi có thể giúp bạn khắc phục sự cố của mình vì tôi khá chắc rằng đó là một lỗi ngớ ngẩn mà bạn đang mắc phải ở đâu đó trong kết nối.
Vì vậy, đây là một số mẹo:
Không kiểm tra mã của bạn "gọi" mã khung lõi ...
Thay vì thực hiện (thử nghiệm đơn vị):
$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());
Thực hiện (kiểm tra tính năng):
$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);
Bằng cách này, bạn có thể đảm bảo rằng:
- URL của bạn là URL bạn muốn, không có bất kỳ lỗi đánh máy nào hoặc bất kỳ lỗi nào
- Bộ điều khiển đang làm những gì nó phải làm, chèn dữ liệu trong trường hợp này.
- Bộ điều khiển đang chèn dữ liệu bạn muốn nó chèn. Giả sử bạn có một số xử lý đằng sau rèm cửa, ở đây bạn có thể đảm bảo rằng bạn đã gửi "1 và 3" và nó đã chèn "vai trò X" (đó là một ví dụ, giả sử đó sẽ là kết quả mong muốn của bạn sau khi xử lý 1 và 3, vì vậy bạn không trực tiếp chèn
1 and 3
) - luôn tránh xác nhận dữ liệu từ nơi bạn đang kiểm tra nó. Trong trường hợp của bạn, bạn đang sử dụng
Request
đối tượng, giả sử nó là lớp tùy chỉnh của bạn và bạn làm điều gì đó khi thực hiện$request->attribute1 = 2
, vì vậy khi bạn đọc lại dưới dạng$request->attribute1
có thể bạn đã thực hiện một số quy trình để lưu trữ nó và bạn đã sửa đổi nó ... nếu bạn đang khẳng định điều đó mà không nói rõ ràngassert that attribute1 is what I expect
bạn không bao giờ khẳng định điều đó. Nếu bạn có lỗi trong mã của mình và thay vì trả vềb
(1
=a
,2
=b
, v.v.) mã sẽ luôn vượt qua, bởi vì bạn đã lưu trữ nó như một thứ khác ngoài mong đợi, nhưng bạn đang xác nhận những gì nó đã làm (giả sử rằng lỗi của bạn trả vềc
thay vìb
) vì vậy bạn đang nói "tìm$request->attribute1
trong cơ sở dữ liệu "và bạn sẽ lưu trữc
thay vìb
(giá trị mong đợi của bạn) và nó vẫn sẽ tìm thấy nó và vượt qua bài kiểm tra.
Không cần tạo kết nối connection
mới nếu nó giống nhau ngoại trừ DB_DATABASE
hoặc tương tự. Trong trường hợp đó, bạn chỉ cần xác định thông tin đó trong .env.testing
hoặc trong phpunit.xml
của bạn .
Ngoài ra, không cần thực hiện <server name="DB_CONNECTION" value="testing"/>
và <env name="DB_CONNECTION" value="testing"/>
. Nếu bạn thấy phpunit.xml
của Laravel GitHub , bạn sẽ thấy rằng họ đã thay đổi <env>
tới <server>
trên 5.7+, vì vậy hãy gắn bó với phiên bản tương ứng với phiên bản của bạn. Có một sự khác biệt mặc dù bây giờ tôi không thể nhớ được, nhưng để thử nghiệm, không có vấn đề gì.
Vì vậy, hãy đảm bảo rằng bạn đã đặt đúng DB_HOST
, DB_PORT
, DB_USERNAME
và DB_PASSWORD
. Bạn có thể có cùng một máy chủ lưu trữ nhưng khác cổng hoặc bạn có thể có máy chủ và cổng giống nhau nhưng tên cơ sở dữ liệu khác nhau, nhưng tên người dùng và mật khẩu giống nhau. Vì vậy, hãy đảm bảo rằng bạn đang kết nối với cơ sở dữ liệu chính xác.
Vì lỗi của bạn là nó không thể tìm thấy bảng mong muốn, rõ ràng là bạn đang kết nối với cơ sở dữ liệu, vì vậy tên người dùng và mật khẩu không phải là vấn đề của bạn, nhưng bảng không tồn tại.
Một điều quan trọng cuối cùng, bạn có đang sử dụng đặc điểm nào trong các bài kiểm tra của mình không? Có một số đặc điểm để tự động di chuyển cơ sở dữ liệu và khôi phục cơ sở dữ liệu khi hoàn tất, vì vậy bạn không cần phải đồng bộ hóa quá trình di chuyển của mình theo cách thủ công trong môi trường thử nghiệm. Bạn nên sử dụng use RefreshDatabase;
đặc điểm để làm như vậy.
Mẹo cuối cùng, cố gắng tránh làm DEF_SOMETHING
bởi vì:
- Nếu bộ điều khiển của bạn có liên quan đến
Defi
, không cần phải nói "đây là dữ liệu DEF", chúng tôi đã biết, vì vậy bạn có thể trực tiếp làmsomething
. Tương tự đối với cơ sở dữ liệu, nếu tên bảng làcars
, tránh làmcar_wheels
,car_doors
, v.v., làmwheels
,doors
, v.v. - Tránh làm
X_Y
, thích làmx_y
, tương tự cho cơ sở dữ liệu. Luôn chú ý đến chữ thường và đối với cơ sở dữ liệu, hãy chú ý đếnsnake_case
, nhưng đối với các thuộc tính của mô hình, hãy luôn gắn vàocamelCase
. ( thông tin khác về các trường hợp)