9

Trong mô-đun của tôi, tôi đã có mã này:

croak("unable to parse file: $!"); 

Sau đó, trong các thử nghiệm của tôi, tôi muốn kiểm tra xem tôi nhận được thông báo lỗi ngay khi tôi cố gắng để phân tích một tập tin mà không tồn tại:

like(
    exception { HTML::Tree->new_from_file("t/non_existent.html") }, 
    qr!^unable to parse file: No such file !, 
    "opening missing file failed" 
); 

Điều này làm việc tốt, miễn là các thử nghiệm đang chạy bằng ngôn ngữ tiếng Anh. Nhưng nếu bạn chạy thử nghiệm bằng ngôn ngữ tiếng Đức, thông báo lỗi sẽ quay trở lại unable to parse file: Datei oder Verzeichnis nicht gefunden và thử nghiệm không thành công. Các miền địa phương khác có vấn đề tương tự.

Tôi không thể tin đây là lần đầu tiên điều này xảy ra, nhưng tôi không thể tìm thấy bất kỳ mô-đun nào trên CPAN giải quyết vấn đề này. Mọi người có đơn giản không bao giờ kiểm tra phần $! của thông báo lỗi không? Có giải pháp nào tốt hơn thay đổi kiểm tra để chỉ kiểm tra qr!^unable to parse file: ! không?

Lưu ý: đây là RT#77823 in HTML-Tree.

Trả lời

5

Có giải pháp nào tốt hơn thay đổi kiểm tra để chỉ kiểm tra qr!^Không thể phân tích cú pháp tệp:!?

$! là biến kép, nghĩa là nó có giá trị chuỗi và số. Bạn có thể sử dụng giá trị số trong thông báo lỗi.

+0

Sẽ ít hữu ích hơn nếu chỉ có số, nhưng tôi cho rằng tôi có thể bao gồm cả số và phiên bản chuỗi. Vấn đề khác là ENOENT không được bảo đảm có cùng giá trị số trên mọi hệ thống. Nó chỉ có vẻ như có nên có một giải pháp tốt hơn so với điều này. – cjm

5

Bạn có thể sử dụng %! để kiểm tra lỗi một cách tượng trưng như trong

unless (open my $fh, "<", "/does/not/exist") { 
    die "$0: unexpected errno " . ($! + 0) 
    unless $!{ENOENT}; 
} 
+0

Điều này sẽ hữu ích nếu _in mã mở tập tin_ Tôi muốn chắc chắn rằng nó là ENOENT. Nhưng 'new_from_file' không quan tâm lỗi là gì. Đó là trong kịch bản thử nghiệm mà tôi nói với nó để mở một tên tập tin không tồn tại, và muốn kiểm tra kết quả. – cjm

1
  1. Các thử nghiệm cho một module M nên không kiểm tra cho các tính năng mà M không phải là chịu trách nhiệm.
  2. Mã không thành công do tệp không tồn tại nên không croak "không thể phân tích cú pháp (tệp spec)", nhưng "không thể tìm thấy (tệp spec)".
1

Con đường tôi giải quyết việc này là đặt

BEGIN { $ENV{LANG} = $ENV{LC_MESSAGES} = $ENV{LC_ALL} = "C" } 

trong bất kỳ kịch bản thử nghiệm đơn vị có liên quan đến thử nghiệm như vậy. Bằng cách đó, miền địa phương được đặt thành C trong suốt thời gian thử nghiệm đó và các thư sẽ đến một cách đáng tin cậy bằng ngôn ngữ C thuần túy, thay vì được bản địa hóa.

+0

Thật không may, điều này [không hoạt động] (http://www.cpantesters.org/cpan/report/1c97c28e-bda5-11e1-8f5a-a473c7b3e486). – cjm

Các vấn đề liên quan