Hướng dẫn dùng assert 意味 trong PHP - use khẳng định có nghĩa là PHP mạnh
TLDR; Cuộn tới: Sử dụng nhà cung cấp dữ liệu của PHPUNIT Show Nội phân chính
Nội phân chính
Nội phân chính
Nội phân chính
Nội phân chính
Phpunit 9.5 cung cấp các phương pháp sau để kiểm tra ngoại lệ:
Tuy nhiên, tài liệu mơ hồ về thứ tự của bất kỳ phương pháp nào ở trên trong mã kiểm tra. Nếu bạn đã quen với việc sử dụng các xác nhận chẳng hạn: ví dụ:
output:
Bạn có thể ngạc nhiên khi thất bại trong bài kiểm tra ngoại lệ:
output:
Lỗi là vì:
Không giống như các lỗi, các ngoại lệ không có khả năng phục hồi từ chúng và khiến PHP tiếp tục thực thi mã như thể không có ngoại lệ nào cả. Do đó, phpunit thậm chí không đến được nơi:
Nếu nó được đi trước:
Hơn nữa, phpunit sẽ không bao giờ có thể đến được nơi đó, bất kể khả năng nắm bắt ngoại lệ của nó. Do đó, sử dụng bất kỳ phương pháp kiểm tra ngoại lệ nào của PHPUnit:
Phải là trước một mã trong đó một ngoại lệ dự kiến sẽ được ném trái ngược với một khẳng định được đặt sau khi một giá trị thực tế được đặt.before a code where an exception is expected to be thrown in contrary to an assertion that is placed after an actual value is set. Một thứ tự thích hợp sử dụng kiểm tra ngoại lệ: ________số 8Bởi vì việc gọi đến các phương thức nội bộ PHPUNIT để kiểm tra các ngoại lệ phải là trước khi một ngoại lệ được ném, điều đó có ý nghĩa rằng các phương thức PHPUNIT liên quan đến các ngoại lệ thử nghiệm bắt đầu từ 5 thay vì 6.Biết rồi:
Bạn sẽ có thể dễ dàng phát hiện ra một lỗi trong bài kiểm tra này:
7 đầu tiên sẽ ổn, nó mong đợi một lớp ngoại lệ trước khi một lớp ngoại lệ chính xác như mong đợi được ném nên không có gì sai ở đây.Phần thứ hai sẽ thất bại mong đợi lớp 8 trước khi một ngoại lệ hoàn toàn khác được ném nên nó sẽ thất bại nhưng liệu thực thi phpunit có đạt được vị trí đó không?Đầu ra của thử nghiệm là: 0 9?Không, nó là xa 9 nếu bài kiểm tra vượt qua và nó sẽ 1 về ngoại lệ thứ hai. Tại sao vậy?Lưu ý rằng đầu ra có:
Trường hợp số lượng kiểm tra là đúng nhưng chỉ có 2.Cần có 2 xác nhận = 9 và 1 làm cho bài kiểm tra không vượt qua.Đó chỉ đơn giản là vì PHPUNIT được thực hiện với việc thực hiện 5 sau dòng: 1Đó là một vé một chiều ngoài phạm vi của 5 đến một nơi nào đó mà phpunit bắt được 7 và làm những gì nó cần làm, nhưng bất cứ điều gì chúng ta có thể biết chúng ta sẽ không thể quay trở lại 5 do đó mã: 2Sẽ không bao giờ được thực hiện và đó là lý do tại sao quan điểm của PHPUNIT, kết quả kiểm tra là 9 thay vì 1.Đó không phải là một tin tốt nếu bạn muốn sử dụng nhiều cuộc gọi 7 hoặc kết hợp các cuộc gọi 7 và 3 trong cùng một phương thức kiểm tra: 3Cho sai:
Trường hợp số lượng kiểm tra là đúng nhưng chỉ có 2.Làm thế nào để kiểm tra nhiều ngoại lệ?Chia nhiều ngoại lệ thành các bài kiểm tra riêng biệt: 4gives: 5 5 như nó nên.Tuy nhiên, phương pháp này có một nhược điểm ở cách tiếp cận cơ bản của nó - đối với mỗi ngoại lệ, bạn cần một bài kiểm tra riêng. Điều đó sẽ làm cho một loạt các bài kiểm tra chỉ để kiểm tra các ngoại lệ. Bắt một ngoại lệ và kiểm tra nó với một khẳng địnhNếu bạn không thể tiếp tục thực thi tập lệnh sau khi một ngoại lệ được ném, bạn có thể chỉ cần nắm bắt một ngoại lệ dự kiến và sau đó lấy tất cả dữ liệu về nó với các phương thức mà một ngoại lệ cung cấp và sử dụng với sự kết hợp của các giá trị và xác nhận dự kiến: 6gives: 7 5 như nó nên nhưng trời ơi, bạn đã đọc tất cả những điều trên? Bạn cần chăm sóc để xóa các biến 7 để phát hiện nếu một ngoại lệ được ném, thì sinh vật này 8 để có một vị trí chính xác của ngoại lệ trong trường hợp nó không được ném Ngoại lệ không được ném.Sử dụng nhà cung cấp dữ liệu của PHPUNITPHPUNIT có một cơ chế hữu ích gọi là nhà cung cấp dữ liệu. Nhà cung cấp dữ liệu là một phương thức trả về dữ liệu (mảng) với các bộ dữ liệu. Một tập dữ liệu duy nhất được sử dụng làm (các) đối số khi phương pháp thử nghiệm - 5 được gọi bởi PHPUNIT.Nếu nhà cung cấp dữ liệu trả về nhiều tập dữ liệu thì phương thức kiểm tra sẽ được chạy nhiều lần, mỗi lần với một tập dữ liệu khác. Điều đó hữu ích khi kiểm tra nhiều ngoại lệ hoặc/và nhiều thuộc tính của ngoại lệ như tên lớp, tin nhắn, mã vì mặc dù: mặc dù:test method will be run multiple times, each time with another data set. That is helpful when testing multiple exceptions or/and multiple exception's properties like class name, message, code because even though:
PHPUNIT sẽ chạy phương thức kiểm tra nhiều lần, mỗi lần với các dữ liệu khác nhau được đặt thay vì kiểm tra ví dụ như nhiều trường hợp ngoại lệ trong một phương thức kiểm tra chạy (sẽ không thành công). Đó là lý do tại sao chúng tôi có thể tạo một phương thức kiểm tra chịu trách nhiệm kiểm tra chỉ một ngoại lệ tại thời điểm đó nhưng chạy phương thức kiểm tra đó nhiều lần với dữ liệu đầu vào khác nhau và ngoại lệ được mong đợi bằng cách sử dụng nhà cung cấp dữ liệu của PHPUNIT. Định nghĩa của phương pháp nhà cung cấp dữ liệu có thể được thực hiện bằng cách thực hiện chú thích 2 cho phương thức kiểm tra cần được cung cấp bởi nhà cung cấp dữ liệu với một tập dữ liệu. 8Kết quả cho: 9Lưu ý rằng ngay cả chỉ có một phương pháp thử nghiệm trong toàn bộ 3 đầu ra của phpunit là:
Vì vậy, ngay cả dòng: 0Đã ném ngoại lệ lần đầu tiên không có vấn đề gì khi kiểm tra một ngoại lệ khác với cùng một phương thức kiểm tra vì PHPunit đã chạy lại với bộ dữ liệu khác nhau nhờ nhà cung cấp dữ liệu. Mỗi tập dữ liệu được trả về bởi nhà cung cấp dữ liệu có thể được đặt tên, bạn chỉ cần sử dụng một chuỗi làm khóa mà theo đó bộ dữ liệu được lưu trữ. Do đó, tên lớp ngoại lệ dự kiến được sử dụng hai lần. Là khóa của mảng tập dữ liệu và là một giá trị (trong khóa 'ClassName') sau đó được sử dụng làm đối số cho 7.Sử dụng các chuỗi làm tên khóa cho các bộ dữ liệu làm cho bản tóm tắt khá và tự giải thích:
Và nếu bạn thay đổi dòng: 1to: 2của 5Để có được các trường hợp ngoại lệ sai và chạy lại PHPUNIT, bạn sẽ thấy: 3như mong đợi:
với chính xác các tên của bộ dữ liệu gây ra một số vấn đề:
Làm cho 5 không ném bất kỳ trường hợp ngoại lệ nào: 4và chạy phpunit một lần nữa đưa ra: 5Có vẻ như sử dụng nhà cung cấp dữ liệu có một số lợi thế:
Kiểm tra ngoại lệ gotchasNgoại lệ của loại "typeerror"Với kiểu dữ liệu PHP7 Hỗ trợ Thử nghiệm này: 6Thất bại với đầu ra: 7Mặc dù có trong phương pháp 7: 8và bài kiểm tra vượt qua một mảng thay vì một chuỗi: 9PHP không đạt được mã: 0Bởi vì ngoại lệ được ném sớm hơn do loại gõ 8: 1Do đó, 9 bị ném thay vì 0ngoại lệ của loại "typeerror" một lần nữaBiết rằng chúng tôi không cần 1 để kiểm tra loại dữ liệu vì PHP đã quan tâm đến điều đó nếu chúng tôi chỉ định loại dữ liệu trong khai báo phương thức 2, chúng tôi có thể muốn ném 0 nếu tin nhắn quá dài 4. 2Sửa đổi cũng 3 vì vậy chúng tôi có hai trường hợp (phương pháp thử nghiệm) trong đó một 6 nên được ném - đầu tiên 7 khi tin nhắn quá dài và thứ hai ____78 khi tin nhắn là một loại sai.Trong cả hai bài kiểm tra, chúng tôi mong đợi thay vì một lớp ngoại lệ cụ thể như 0 hoặc 9 chỉ là một lớp 6 chung bằng cách sử dụng 2Kết quả kiểm tra là: 3 3 mong đợi một 6 chung và sử dụng 2vượt qua với 9 khi 0 bị némnhưng 8 Sử dụng cùng một 2 0 với mô tả:
Có vẻ khó hiểu khi phpunit phàn nàn rằng ngoại lệ 9 không phải là 6, nếu không nó sẽ không có vấn đề gì với 2 bên trong 8 vì nó không có bất kỳ vấn đề nào với 3 ném 0 và mong đợi: 2exception 9 was not an 6, otherwise it would not have had any problem with 2 inside the 8 as it did not have any problem with the 3 throwing 0 and expecting: 2
Vấn đề là phpunit đánh lừa bạn với mô tả như trên vì 9 không phải là một ngoại lệ. 9 không kéo dài từ lớp 6 cũng như từ bất kỳ con nào khác.not an exception. 9 does not extends from the 6 class nor from any other its children. 9 thực hiện giao diện 02 Xem tài liệunhưng trái lại 0 mở rộng tài liệu ____104và 04 mở rộng tài liệu 6Do đó 0 cũng mở rộng 6.Đó là lý do tại sao ném bài kiểm tra 0 vượt qua OK và 2 nhưng ném 9 sẽ không (nó không mở rộng 6)Tuy nhiên, cả 6 và 9 đều thực hiện giao diện 02.Do đó thay đổi trong cả hai bài kiểm tra 2đến 17làm cho kiểm tra màu xanh lá cây: 4Xem danh sách các lỗi và các lớp ngoại lệ và cách chúng có liên quan với nhau. Để rõ ràng: Đó là một thông lệ tốt để sử dụng một ngoại lệ hoặc lỗi cụ thể cho kiểm tra đơn vị thay vì một 6 hoặc 02 chung Thực tế không phải 6s mà 02
|